• [CQOI2011]动态逆序对


    description

    洛谷

    data range

    [nle 10^5,mle 5 imes 10^4 ]

    solution

    (CDQ)分治。

    只是要写很多个修改和查询。

    把自己搞晕了。调了半节晚自习。

    (CDQ)的部分倒是没有出什么问题。

    code

    #include<bits/stdc++.h>
    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<iomanip>
    #include<cstring>
    #include<complex>
    #include<vector>
    #include<cstdio>
    #include<string>
    #include<bitset>
    #include<ctime>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #define Cpy(x,y) memcpy(x,y,sizeof(x))
    #define Set(x,y) memset(x,y,sizeof(x))
    #define FILE "a"
    #define mp make_pair
    #define pb push_back
    #define RG register
    #define il inline
    using namespace std;
    typedef unsigned long long ull;
    typedef vector<int>VI;
    typedef long long ll;
    typedef double dd;
    const dd eps=1e-6;
    const int mod=1e9+7;
    const int N=1e6+10;
    const int M=1e6+10;
    const int inf=2147483647;
    const ll INF=1e18+1;
    const ll P=100000;
    il ll read(){
    	RG ll data=0,w=1;RG char ch=getchar();
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
    	return data*w;
    }
    il void file(){
    	srand(time(NULL)+rand());
    	freopen("2.in","r",stdin);
    	freopen(FILE".out","w",stdout);
    }
    
    int n,m,k,a[N],p[N],da[N],d[N];ll ans[N];
    struct node{int tp,t,p,v,id,w;}Q[N],tmp[N];
    bool cmp1(node a,node b){if(a.t!=b.t)return a.t<b.t;return a.tp<b.tp;}
    bool cmp2(node a,node b){if(a.p!=b.p)return a.p<b.p;return a.tp<b.tp;}
    
    int t[N];
    il void insert(int i,int v){for(;i<=n;i+=(i&-i))t[i]+=v;}
    il void clear(int i){for(;i<=n;i+=(i&-i))t[i]=0;}
    il int query(int i){int r=0;for(;i;i-=(i&-i))r+=t[i];return r;}
    void cdq(int l,int r){
    	if(l==r)return;RG int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);
    	for(RG int i=l,p1=l,p2=mid+1;i<=r;i++)
    		if(p2>r||(p1<=mid&&cmp2(Q[p1],Q[p2]))){
    			if(Q[p1].tp==1)insert(Q[p1].v,Q[p1].w);
    			tmp[i]=Q[p1++];
    		}
    		else{
    			if(Q[p2].tp==2)ans[Q[p2].id]+=query(Q[p2].v)*Q[p2].w;
    			tmp[i]=Q[p2++];
    		}
    	for(RG int i=l;i<=r;i++){if(Q[i].v)clear(Q[i].v);Q[i]=tmp[i];}
    }
    
    int main()
    {
    	n=read();m=read();
    	for(RG int i=1;i<=n;i++)a[i]=read(),p[a[i]]=i;
    	for(RG int i=1;i<=m;i++)da[i]=read(),d[i]=p[da[i]];
    	for(RG int i=1;i<=n;i++){
    		Q[++k]=(node){1,0,i,a[i],0,1};
    		Q[++k]=(node){2,0,i,n,0,1};
    		Q[++k]=(node){2,0,i,a[i],0,-1};
    	}
    	for(RG int i=1;i<m;i++){
    		Q[++k]=(node){1,i,d[i],da[i],0,-1};
    		Q[++k]=(node){2,i,d[i],n,i,1};
    		Q[++k]=(node){2,i,d[i],da[i],i,-1};
    		Q[++k]=(node){2,i,n,da[i]-1,i,1};
    		Q[++k]=(node){2,i,d[i],da[i]-1,i,-1};
    	}
    	sort(Q+1,Q+k+1,cmp1);cdq(1,k);
    	for(RG int i=2;i<m;i++)ans[i]+=ans[i-1];
    	for(RG int i=1;i<m;i++)ans[i]=ans[0]-ans[i];
    	for(RG int i=0;i<m;i++)printf("%lld
    ",ans[i]);
    	return 0;
    }
    
    
  • 相关阅读:
    滑动最小值 /// 单调队列
    Largest Rectangle in a Histogram /// 单调栈 oj23906
    能量项链 /// oj23800
    Traveling by Stagecoach /// 状压DP oj22914
    Hamilton回路 旅行商TSP问题 /// dp oj1964
    最难的工作 /// SPFA模板 oj1396
    次短路 /// dijkstra oj1597
    USACO 2006 November Gold Fence Repair /// 贪心(有意思)(优先队列) oj23940
    石子合并问题 /// 区间DP oj2025
    多边形游戏 /// 区间DP oj1903
  • 原文地址:https://www.cnblogs.com/cjfdf/p/9671270.html
Copyright © 2020-2023  润新知