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); } }
相关文章推荐
- C++ 智能指针
- 排序算法及并行分析
- linux文件系统之读流程 SYSCALL_DEFINE3(read, xxx)
- Day6
- Spark 定制版:001~Spark Streaming(一)
- svn利用钩子post-commit自动更新到线上测试服务器(测试中未验证)
- sublime Text 3安装模板插件
- 对照Java学习Swift--下标(Subscripts)
- GC
- StackExchange.Redis 使用 - 事件(五)
- web开发 那些年基于Redis的Provider库
- cin与scanf cout与printf效率问题
- HDOJ(HDU) 2137 circumgyrate the string(此题用Java-AC不过!坑)
- HDOJ(HDU) 2137 circumgyrate the string(此题用Java-AC不过!坑)
- 新建一个Fragment时需要宿主Activity向该Fragment传递数据
- 编辑距离
- Minecraft源码分析(3) - 刷怪笼(MobSpawner)逻辑
- java实现输入指定年打印该年日历练习
- Header函数和PHP_AUTH_USER做用户验证
- 如果有人问你数据库的原理,叫他看这篇文章(下)