zoukankan      html  css  js  c++  java
  • CF785E Anton and Permutation

    CF785E Anton and Permutation

    CF785E Anton and Permutation

    显然可以单独考虑每次交换对答案的贡献,然后树套树硬上即可。

    树套树代码:

    view code
    #include<bits/stdc++.h>
    using namespace std;
    template <typename T>
    inline void read(T &x){
    	x=0;char ch=getchar();bool f=false;
    	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
    	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	x=f?-x:x;
    	return ;
    }
    template <typename T>
    inline void write(T x){
    	if(x<0) putchar('-'),x=-x;
    	if(x>9) write(x/10);
    	putchar(x%10^48);
    	return ;
    }
    const int N=2e5+1,M=3e7+1;
    int n,Q,a[N],rt[N];
    long long ans;
    int ls[M],rs[M],tot,val[M];
    void Modify(int &now,int l,int r,int x,int k){
    	if(!now) now=++tot;
    	val[now]+=k;
    	if(l==r)return;
    	int mid=l+r>>1;
    	if(x<=mid) Modify(ls[now],l,mid,x,k);
    	else Modify(rs[now],mid+1,r,x,k);
    }
    int qa[N],qb[N];
    inline long long Query(int l,int r,int x,int type){
    	int cnta=0,cntb=0;
    	long long ans=0;
    	for(int i=l-1;i;i-=i&-i) qa[++cnta]=rt[i];
    	for(int i=r;i;i-=i&-i) qb[++cntb]=rt[i];
    	l=1,r=n;
    	while(l<r){
    		int mid=l+r>>1;
    		if(x>mid){
    			if(type){
    				for(int i=1;i<=cnta;i++) ans-=val[ls[qa[i]]];
    				for(int i=1;i<=cntb;i++) ans+=val[ls[qb[i]]];
    			}
    			for(int i=1;i<=cnta;i++) qa[i]=rs[qa[i]];
    			for(int i=1;i<=cntb;i++) qb[i]=rs[qb[i]];
    			l=mid+1;
    		}
    		else{
    			if(!type){
    				for(int i=1;i<=cnta;i++) ans-=val[rs[qa[i]]];
    				for(int i=1;i<=cntb;i++) ans+=val[rs[qb[i]]];
    			}
    			for(int i=1;i<=cnta;i++) qa[i]=ls[qa[i]];
    			for(int i=1;i<=cntb;i++) qb[i]=ls[qb[i]];
    			r=mid;
    		}
    	}
    	return ans;
    }
    signed main(){
    	read(n),read(Q);
    	for(int i=1;i<=n;i++){
    		a[i]=i;
    		for(int j=i;j<=n;j+=j&-j) Modify(rt[j],1,n,a[i],1);
    	}
    	while(Q--){
    		int x,y;read(x),read(y);
    		if(x==y){write(ans),putchar('
    ');continue;}
    		if(x>y)swap(x,y);
    		ans=ans-Query(1,x-1,a[x],0)-Query(x+1,n,a[x],1)-Query(1,y-1,a[y],0)-Query(y+1,n,a[y],1);
    		for(int i=x;i<=n;i+=i&-i) Modify(rt[i],1,n,a[x],-1),Modify(rt[i],1,n,a[y],1);
    		for(int i=y;i<=n;i+=i&-i) Modify(rt[i],1,n,a[x],1),Modify(rt[i],1,n,a[y],-1);
    		swap(a[x],a[y]);
    		ans=ans+Query(1,x-1,a[x],0)+Query(x+1,n,a[x],1)+Query(1,y-1,a[y],0)+Query(y+1,n,a[y],1);
    		ans+=(a[x]<a[y]?1:-1);
    		write(ans),putchar('
    ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    Day 38
    Day 37
    Day 36
    Day 35
    Day 34
    Day 33
    Day 32
    Day 31
    Day 30
    华为CE6180高级ACL配置
  • 原文地址:https://www.cnblogs.com/Akmaey/p/14648622.html
Copyright © 2011-2022 走看看