BZOJ3744 Gty的妹子序列(分块+树状数组)
2024-08-31 10:26:23
题意
询问区间内逆序对数 强制在线
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 ;
}
最新文章
- HDU 5183 Negative and Positive (NP) --Hashmap
- MATLAB函数freqz()
- Ubuntu使用总结
- spring Transaction Management --官方
- Wsyscheck(系统检测维护工具) v1.68.33绿色版
- Java反射机制剖析(二)-功能以及举例
- iOS 多人共享开发证书
- IE浏览器右键菜单插件开发(下篇)——如何用c#安装、卸载IE右键插件
- Python菜鸟快乐游戏编程_pygame(2)
- Spring Cloud 2-Hystrix DashBoard仪表盘(五)
- scoketio
- node.js(小案例)_使用mongodb对学生信息列表优化
- 【学习笔记 边分树】【uoj400】【CTSC2018】暴力写挂
- div界面浮动插件
- MSSQL如何将查询结果拼接成字符串
- jquery自动填充输入框
- 阿里巴巴Java开发手册- 控制语句
- django系列3.2--url的别名和反向解析 reverse
- SQL映射文件
- canvas制作柱形图/折线图/饼状图,Konva写动态饼状图
热门文章
- Swift学习笔记(10):类和结构体
- LeetCode hard 668. Kth Smallest Number in Multiplication Table(二分答案,一次过了,好开心,哈哈哈哈)
- hiho169周 - 表达式求值
- hdu 6082 - 完全背包,打表。
- css文字超出变省略号...
- .is() 全选复选的判断
- Java正则类
- bzoj4551 [HEOI2016]树
- BZOJ 3881 [COCI2015]Divljak (Trie图+Fail树+树链的并+树状数组维护dfs序)
- redis搭建与安装2