• BZOJ_3744_Gty的妹子序列


    BZOJ3744: Gty的妹子序列

    https://lydsy.com/JudgeOnline/problem.php?id=3744

    分析:

    • 预处理出来每一块块首到所有位置的逆序对数。
    • 查询时主席树上查即可。
    • 卡常

    代码:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    #define N 60050
    typedef int ll;
    int n,a[N],m;
    int blo,size,L[N],R[N],pos[N];
    int siz[N*23],ls[N*23],rs[N*23],cnt,V[N],ln,root[N];
    ll ansblo[305][N];
    void update(int l,int r,int x,int &p,int q) {
    	p=++cnt; siz[p]=siz[q]+1; ls[p]=ls[q]; rs[p]=rs[q];
    	if(l==r) return ;
    	int mid=(l+r)>>1;
    	if(x<=mid) update(l,mid,x,ls[p],ls[q]);
    	else update(mid+1,r,x,rs[p],rs[q]);
    }
    int qmnx(int l,int r,int x,int p,int q) {
    	if(l==r) return l<=x?siz[q]-siz[p]:0;
    	int mid=(l+r)>>1;
    	if(x<=mid) return qmnx(l,mid,x,ls[p],ls[q]);
    	else return qmnx(mid+1,r,x,rs[p],rs[q])+siz[ls[q]]-siz[ls[p]];
    } 
    int qmxx(int l,int r,int x,int p,int q) {
    	if(l==r) return l>=x?siz[q]-siz[p]:0;
    	int mid=(l+r)>>1;
    	if(x<=mid) return qmxx(l,mid,x,ls[p],ls[q])+siz[rs[q]]-siz[rs[p]];
    	else return qmxx(mid+1,r,x,rs[p],rs[q]);
    }
    ll work(int x,int y) {
    	int p=pos[x],q=pos[y],i;
    	ll re=0;
    	if(p==q) {
    		for(i=x+1;i<=y;i++) {
    			re+=qmxx(1,ln,a[i]+1,root[x-1],root[i-1]);
    		}
    		return re;
    	}
    	re=ansblo[p+1][y];
    	for(i=R[p];i>=x;i--) {
    		re+=qmnx(1,ln,a[i]-1,root[i],root[y]);
    	}
    	return re;
    }
    int s[N];
    void fix(int x){for(;x<=ln;x+=x&-x)s[x]++;}
    int find(int x){int ret=0;for(;x;x-=x&-x)ret+=s[x];return ret;}
    int main() { 
    	///////////////////////////////////////////////////////////////////////////////////////////////
    	///*////////////////*/freopen("noon.in","r",stdin); freopen("noon.out","w",stdout);//////////////
    	///////////////////////////////////////////////////////////////////////////////////////////////
    	scanf("%d",&n);
    	int i,j,x,y,k;
    	size=sqrt(n);
    	blo=(n+size-1)/size;
    	for(i=1;i<=n;i++) scanf("%d",&a[i]),V[i]=a[i];
    	sort(V+1,V+n+1);
    	ln=unique(V+1,V+n+1)-V-1;
    	for(i=1;i<=n;i++) a[i]=lower_bound(V+1,V+ln+1,a[i])-V;
    	for(i=1;i<=n;i++) {
    		update(1,ln,a[i],root[i],root[i-1]);
    	}
    	for(i=1;i<=blo;i++) {
    		L[i]=R[i-1]+1; R[i]=min(i*size,n);
    		for(j=L[i];j<=R[i];j++) {
    			pos[j]=i;
    		}
    	}
    	for(i=1;i<=blo;i++) {
    		memset(s,0,sizeof(s));
    		for(j=L[i];j<=n;j++) {
    			ansblo[i][j]=ansblo[i][j-1]+j-L[i]-find(a[j]);
    			fix(a[j]);
    		}
    	}
    	scanf("%d",&m);
    	ll ans=0;
    	while(m--) {
    		scanf("%d%d",&x,&y);
    		x^=ans; y^=ans;
    		ans=work(x,y);
    		printf("%d
    ",ans);
    	}
    }
    
  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/suika/p/10014969.html
Copyright © 2020-2023  润新知