分治与二分

分治/二分

 

分治/二分算法本质上都是采用了“分而治之”的思想,因此放在一起来讲。

 

所谓分而治之,即把一个大的问题转化成一个、两个或多个小的问题之和。

P1908 逆序对

 

 

 

复制代码
#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

int num[500010];
int res[500010];
long long  ans = 0;    int n;

void d_sort(int x, int y) {
    //cout << n << "**" << endl;
    if(x+1>=y) return;
    int m = x+(y-x)/2;
    int p = x, q = m, i = x;
    d_sort( p, m);
    d_sort( m, y);
    while(p < m || q < y) {
        if(q >= y || (p<m && num[p]<=num[q])) {
            res[i++] = num[p++];
        }
        else res[i++]=num[q++], ans += (m-p);
    }
    for (int j = x; j < y; j++) num[j]=res[j];
}

int main() {
//    freopen("P1908_11.in","r", stdin);
//    freopen("P19_11.txt", "w", stdout);
    cin >> n;
    //cout << n << " 11" << endl;
    for (int i = 1; i <= n; i++) {
        cin >> num[i];
    }
    d_sort(1, n+1);
//    for (int i = 1; i <= n; i ++) {
//        cout << num[i] <<" ";
//    }cout << endl;
    cout << ans <<endl;


//fclose(stdin);
//fclose(stdout);
}
复制代码

 

 P1083借教室

 

 

复制代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
namespace FastIO
{
    #define gc() readchar()
    #define pc(a) putchar(a)
    #define SIZ (int)(1e6+15)
    char buf1[SIZ],*p1,*p2;
    char readchar()
    {
        if(p1==p2)p1=buf1,p2=buf1+fread(buf1,1,SIZ,stdin);
        return p1==p2?EOF:*p1++;
    }
    template<typename T>void read(T &k)
    {
        char ch=gc();T x=0,f=1;
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
        while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
        k=x*f;
    }
    template<typename T>void write(T k)
    {
        if(k<0){k=-k;pc('-');}
        static T stk[66];T top=0;
        do{stk[top++]=k%10,k/=10;}while(k);
        while(top){pc(stk[--top]+'0');}
    }
}using namespace FastIO;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(1e6+15)

int n,m,a[N],b[N],c[N],l[N],r[N];
signed main()
{
    read(n);read(m);
    for(int i=1; i<=n; i++) 
        read(a[i]);
    for(int i=1; i<=m; i++)
    {
        read(c[i]);read(l[i]);read(r[i]);
        b[l[i]]+=c[i];b[r[i]+1]-=c[i];
    }
    int j=m,res=m,sum=0;
    for(int i=1; i<=n; i++)
    {
        sum+=b[i];
        if(sum>a[i])
        {
            while(sum>a[i])
            {
                b[l[j]]-=c[j];
                b[r[j]+1]+=c[j];
                if(l[j]<=i&&i<=r[j])
                    sum-=c[j];
                j--;
            }
            res=j;
        }
    }
    if(res<m)printf("-1\n%lld",res+1);
    else puts("0");
    return 0;
}
复制代码

 

posted @   神茗掉线中(冲AC)  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示