您的位置:首页 > 其它

bzoj3744 Gty的妹子序列

2016-05-05 00:55 232 查看
  乱搞,处理出这三样东西,[1,i]所包含的逆序对数cnt[i],区间[1,i]对于区间[j*sqrt(n),(j+1)*sqrt(n)]的逆序对数sum[j][i],以及倒序将每个元素插入主席树,那么询问[l,r]的答案就为[1,r]的逆序对数减去[1,l-1]的逆序对数减去(A,B)(A∈[1,l-1],B∈[l,r])的逆序对数,最后一个可以根据预处理出的信息求出,时间复杂度O(nsqrt(n)log(n))。

  代码

#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#define fi first
#define sc second
#define mp make_pair
#define pb push_back
#define lb(x) (x&-x)
using namespace std;
const int N = 50010;
const int M = 1010100;
int n,a
,i,j,k,cnt
,c
,tot,B,tt,v[M],b
;
int s[205]
,ls[M],rs[M],root
,ans;
map<int,int> ma;
void insert(int &x,int y,int l,int r,int a,int b)
{
x=++tt;
ls[x]=ls[y];
rs[x]=rs[y];
v[x]=v[y];
if ((a<=l)&&(r<=b))
{
v[x]++;
return;
}
int m=(l+r)>>1;
if (a<m) insert(ls[x],ls[y],l,m,a,b);
if (m<b) insert(rs[x],rs[y],m,r,a,b);
v[x]=v[ls[x]]+v[rs[x]];
}
int query(int y,int x,int l,int r,int a,int b)
{
if (!y) return 0;
if ((a<=l)&&(r<=b)) return v[y]-v[x];
int m=(l+r)>>1,ans=0;
if (a<m) ans+=query(ls[y],ls[x],l,m,a,b);
if (m<b) ans+=query(rs[y],rs[x],m,r,a,b);
return ans;
}
void cc(int x,int w)
{
while (x<=tot)
{
c[x]+=w;
x+=lb(x);
}
}
int sum(int x)
{
int ans=0;
while (x)
{
ans+=c[x];
x-=lb(x);
}
return ans;
}
int main()
{
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
for (i=0;i<n;i++)
if (ma[b[i]]==0) ma[b[i]]=++tot;
for (i=0;i<n;i++)
a[i]=ma[a[i]];

for (i=0;i<n;i++)
{
if (i) cnt[i]=cnt[i-1]+sum(tot)-sum(a[i]);
cc(a[i],1);
}
B=250;
for (i=0;;i++)
if (i*B>=n) break;
else
{
for (j=1;j<=tot;j++) c[j]=0;
for (j=i*B;(j<(i+1)*B) && (j<n);j++) cc(a[j],1);
for (j=0;j<n;j++)
{
s[i][j]=sum(tot)-sum(a[j]);
if (j) s[i][j]+=s[i][j-1];
}
}

for (i=n-1;i>=0;i--)
insert(root[i],root[i+1],0,tot,a[i]-1,a[i]);

int q;
scanf("%d",&q);
for (i=1;i<=q;i++)
{
int l,r;
scanf("%d%d",&l,&r);
l^=ans;r^=ans;
l--;r--;
ans=cnt[r];if (l) ans-=cnt[l-1];
for (j=0;j<l/B;j++)
{
int w=s[j][r];if (l) w-=s[j][l-1];
ans-=w;
}
for (k=j*B;k<l;k++)
if (a[k]-1) ans-=query(root[l],root[r+1],0,tot,0,a[k]-1);
printf("%d\n",ans);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: