• CDQ(动态逆序对的几种做法)


    菜鸡总觉得自己会了很多东西 然而在学长的鞭策下 还有很多需要加深的  希望再一次突破自己的数据结构!

    #include <bits/stdc++.h>
    #define f first
    #define s second
    #define ll long long
    #define pii pair<ll,int>
    #define inc(i,l,r) for(int i=l;i<=r;i++)
    const int MAXN=1e5+10;
    using namespace std;
    ll read(){  
        ll x=0,f=1;char ch=getchar();  
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}  
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();  
        return f*x;
    }
    int a[MAXN];int b[MAXN],c[MAXN];
    int G[MAXN];
    ll ans[MAXN];ll d[MAXN];
    int n,m;
    int get_id(int x){return x&(-x);}
    ll Sum(int x){
    	ll sum=0;
    	for(int i=x;i>0;i-=get_id(i))sum+=d[i];
    	return sum;
    }
    void update(int x,int vul){
    	for(int i=x;i<=m+1;i+=get_id(i))d[i]+=vul;
    }
    void update1(int x,int vul){
    	for(int i=x;i<=n;i+=get_id(i))d[i]+=vul;
    }
    void clean(int x){
    	for(int i=x;i<=m+1;i+=get_id(i))d[i]=0;
    }
    void querty(int l,int r,int mid){
    	int i=l,j=mid+1;G[0]=0;
    	while(i<=mid&&j<=r){
    		while(i<=mid&&c[i]<c[j]){
    			G[++G[0]]=c[i];
    			update(b[c[i]],1);i++;
    		}
    		ans[b[c[j]]]+=Sum(m+1)-Sum(b[c[j]]);
    		G[++G[0]]=c[j];
    		j++;
    	}
    	if(i<=mid){
    		for(;i<=mid;i++)G[++G[0]]=c[i];
    	}
    	if(j<=r){
    		for(;j<=r;j++){
    			ans[b[c[j]]]+=Sum(m+1)-Sum(b[c[j]]);
    			G[++G[0]]=c[j];
    		}
    	}
    	for(int i=1;i<=G[0];i++)c[l+i-1]=G[i],clean(b[G[i]]);
    }
    void cdq(int l,int r){
    	if(l>=r)return ;
    	int mid=(l+r)>>1;
    	cdq(l,mid);
    	cdq(mid+1,r);
    	querty(l,r,mid);
    }
    void querty1(int l,int r,int mid){
    	int i=l,j=mid+1;G[0]=0;
    	while(i<=mid&&j<=r){
    		while(i<=mid&&a[i]>a[j]){
    			G[++G[0]]=a[i];
    			update(b[a[i]],1);i++;
    		}
    		ans[b[a[j]]]+=Sum(m+1)-Sum(b[a[j]]);
    		G[++G[0]]=a[j];
    		j++;
    	}
    	if(i<=mid){
    		for(;i<=mid;i++)G[++G[0]]=a[i];
    	}
    	if(j<=r){
    		for(;j<=r;j++){
    			ans[b[a[j]]]+=Sum(m+1)-Sum(b[a[j]]);
    			G[++G[0]]=a[j];
    		}
    	}
    	for(int i=1;i<=G[0];i++)a[l+i-1]=G[i],clean(b[G[i]]);
    }
    void cdq1(int l,int r){
    	if(l>=r)return ;
    	int mid=(l+r)>>1;
    	cdq1(l,mid);
    	cdq1(mid+1,r);
    	querty1(l,r,mid);
    }
    int main(){
    	n=read();m=read();
    	inc(i,1,n)a[i]=read(),c[n-i+1]=a[i];
    	int vul;
    	inc(i,1,m)vul=read(),b[vul]=i;
    	inc(i,1,n)if(!b[i])b[i]=m+1;
    	ll sum=0;
    	for(int i=1;i<=n;i++){
    		sum+=(Sum(n)-Sum(a[i]));
    		update1(a[i],1);
    	}
    	for(int i=1;i<=n;i++)clean(a[i]);
    	cdq(1,n);
    	cdq1(1,n);
    	printf("%lld
    ",sum);
    	for(int i=1;i<m;i++)sum-=ans[i],printf("%lld
    ",sum);
    	return 0;
    }
    

      

  • 相关阅读:
    CNN comprehension
    Gradient Descent
    Various Optimization Algorithms For Training Neural Network
    gerrit workflow
    jenkins job配置脚本化
    Jenkins pipeline jobs隐式传参
    make words counter for image with the help of paddlehub model
    make words counter for image with the help of paddlehub model
    git push and gerrit code review
    image similarity
  • 原文地址:https://www.cnblogs.com/wang9897/p/9124210.html
Copyright © 2020-2023  润新知