• 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);
    	}
    }
    
  • 相关阅读:
    js实现完美身份证号有效性验证
    jQuery cookie操作
    脚本化HTTP
    if (HttpContext.Current.User.Identity.IsAuthenticated) 权限验证总是true
    装了appserv之后,浏览器中访问localhost加载不了
    rdlc报表的导出及预览时表头
    oracle中的to_number在mysql中的转换
    GIRDVIEW 控件绑定数据后 后台c#控制隐藏某列
    mysql、oracle 中按照拼音首字母排序
    阅读《大道至简第一章》读后感(java伪代码)
  • 原文地址:https://www.cnblogs.com/suika/p/10014969.html
Copyright © 2020-2023  润新知