题意

询问区间内逆序对数  强制在线

1<=n<=50000 1<=m<=50000

题解

两个预处理f[i][j]为块i到j的逆序对数,s[i][j]前i块≤j的有多少个
边角余料用个树状数组就行了

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int n,Block,a[N],b[N],block[N],R[],L[],f[][],tr[][N],m,ans;
int lowbit(int x){
return x&-x;
}
void add(int id,int x,int w){
for(int i=x;i<=n;i+=lowbit(i)){
tr[id][i]+=w;
}
}
int getsum(int id,int x){
int tmp=;
for(int i=x;i;i-=lowbit(i)){
tmp+=tr[id][i];
}
return tmp;
}
int main(){
scanf("%d",&n);
Block=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
block[i]=(i-)/Block+;
if(!L[block[i]])L[block[i]]=i;
R[block[i]]=i;
}
sort(b,b++n);
int tot=unique(b+,b++n)-b-;
for(int i=;i<=n;i++){
a[i]=lower_bound(b+,b++tot,a[i])-b;
}
for(int i=;i<=block[n];i++){
for(int j=L[i];j<=n;j++){
add(i,a[j],);
}
}
for(int i=;i<=block[n];i++){
int tot=;
for(int j=L[i];j<=n;j++){
add(,a[j],);
tot+=getsum(,n)-getsum(,a[j]);
f[i][block[j]]=tot;
}
for(int j=L[i];j<=n;j++){
add(,a[j],-);
}
}
scanf("%d",&m);
while(m--){
int l,r;
scanf("%d%d",&l,&r);
l=l^ans;r=r^ans;
if(l>r)swap(l,r);
if(l==||r==||l>n||r>n)continue;
if(block[l]+>=block[r]){
ans=;
for(int i=l;i<=r;i++){
add(,a[i],);
ans+=getsum(,n)-getsum(,a[i]);
}
for(int i=l;i<=r;i++){
add(,a[i],-);
}
}
else{
ans=f[block[l]+][block[r]-];
int size=L[block[r]]-R[block[l]]-;
// cout<<ans<<" "<<size<<"sdjksd"<<endl;
for(int i=l;i<=R[block[l]];i++){
ans+=getsum(block[l]+,a[i]-)-getsum(block[r],a[i]-);
add(,a[i],);
ans+=getsum(,n)-getsum(,a[i]);
}
for(int i=L[block[r]];i<=r;i++){
ans+=size-(getsum(block[l]+,a[i])-getsum(block[r],a[i]));
add(,a[i],);
ans+=getsum(,n)-getsum(,a[i]);
}
for(int i=l;i<=R[block[l]];i++){
add(,a[i],-);
}
for(int i=L[block[r]];i<=r;i++){
add(,a[i],-);
}
}
printf("%d\n",ans);
}
return ;
}

最新文章

  1. HDU 5183 Negative and Positive (NP) --Hashmap
  2. MATLAB函数freqz()
  3. Ubuntu使用总结
  4. spring Transaction Management --官方
  5. Wsyscheck(系统检测维护工具) v1.68.33绿色版
  6. Java反射机制剖析(二)-功能以及举例
  7. iOS 多人共享开发证书
  8. IE浏览器右键菜单插件开发(下篇)——如何用c#安装、卸载IE右键插件
  9. Python菜鸟快乐游戏编程_pygame(2)
  10. Spring Cloud 2-Hystrix DashBoard仪表盘(五)
  11. scoketio
  12. node.js(小案例)_使用mongodb对学生信息列表优化
  13. 【学习笔记 边分树】【uoj400】【CTSC2018】暴力写挂
  14. div界面浮动插件
  15. MSSQL如何将查询结果拼接成字符串
  16. jquery自动填充输入框
  17. 阿里巴巴Java开发手册- 控制语句
  18. django系列3.2--url的别名和反向解析 reverse
  19. SQL映射文件
  20. canvas制作柱形图/折线图/饼状图,Konva写动态饼状图

热门文章

  1. Swift学习笔记(10):类和结构体
  2. LeetCode hard 668. Kth Smallest Number in Multiplication Table(二分答案,一次过了,好开心,哈哈哈哈)
  3. hiho169周 - 表达式求值
  4. hdu 6082 - 完全背包,打表。
  5. css文字超出变省略号...
  6. .is() 全选复选的判断
  7. Java正则类
  8. bzoj4551 [HEOI2016]树
  9. BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
  10. redis搭建与安装2