题目链接

静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于等于j的数的个数,$inv[i][j]$表示第i块与第j块之间的逆序对数,递推搞一下就行。查询的时候中间的部分直接查询,两边多出来的部分暴力计算贡献即可。总复杂度$O(n\sqrt nlogn)$

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+,sqrtN=,inf=0x3f3f3f3f;
int a[N],b[N],c[N],n2,in[N],L[sqrtN],R[sqrtN],n,m,sqrtn,nb;
int sum[sqrtN][N],inv[sqrtN][sqrtN];
void add(int u,int x) {for(; u<=n2; u+=u&-u)c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=u&-u)ret+=c[u]; return ret;}
int main() {
scanf("%d",&n),sqrtn=sqrt(n+0.5);
for(int i=; i<=n; ++i)scanf("%d",&a[i]);
for(int i=; i<=n; ++i)b[i-]=a[i];
sort(b,b+n),n2=unique(b,b+n)-b;
for(int i=; i<=n; ++i)a[i]=lower_bound(b,b+n2,a[i])-b+;
for(int i=; i<=n; ++i) {nb=in[i]=i/sqrtn+; if(!L[in[i]])L[in[i]]=i; R[in[i]]=i;}
for(int i=; i<=nb; ++i) {
for(int j=L[i]; j<=R[i]; ++j)sum[i][a[j]]++;
for(int j=; j<=n; ++j)sum[i][j]+=sum[i][j-];
for(int j=; j<=n; ++j)sum[i][j]+=sum[i-][j];
}
for(int i=; i<=nb; ++i) {
for(int j=R[i]; j>=L[i]; --j)inv[i][i]+=get(a[j]-),add(a[j],);
for(int j=R[i]; j>=L[i]; --j)add(a[j],-);
}
for(int i=; i<=nb; ++i)
for(int j=i+; j<=nb; ++j) {
for(int k=L[j]; k<=R[j]; ++k)inv[i][j]+=(R[j-]-L[i]+)-(sum[j-][a[k]]-sum[i-][a[k]]);
inv[i][j]+=inv[i][j-]+inv[j][j];
}
scanf("%d",&m);
for(int ans=; m--;) {
int l,r;
scanf("%d%d",&l,&r),l^=ans,r^=ans,ans=;
if(in[l]==in[r]) {
for(int i=r; i>=l; --i)ans+=get(a[i]-),add(a[i],);
for(int i=r; i>=l; --i)add(a[i],-);
} else {
int lb=in[l]+,rb=in[r]-;
if(lb<=rb) {
ans+=inv[lb][rb];
for(int i=r; i>=L[in[r]]; --i)ans+=(R[rb]-L[lb]+)-(sum[rb][a[i]]-sum[lb-][a[i]]);
for(int i=R[in[l]]; i>=l; --i)ans+=sum[rb][a[i]-]-sum[lb-][a[i]-];
}
for(int i=r; i>=L[in[r]]; --i)ans+=get(a[i]-),add(a[i],);
for(int i=R[in[l]]; i>=l; --i)ans+=get(a[i]-),add(a[i],);
for(int i=r; i>=L[in[r]]; --i)add(a[i],-);
for(int i=R[in[l]]; i>=l; --i)add(a[i],-);
}
printf("%d\n",ans);
}
return ;
}

BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)的更多相关文章

  1. bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块

    题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...

  2. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

  3. BZOJ 3744 Gty的妹子序列 (分块 + BIT)

    3744: Gty的妹子序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1931  Solved: 570[Submit][Status][Dis ...

  4. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  5. BZOJ 3744 Gty的妹子序列

    Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...

  6. BZOJ 3744: Gty的妹子序列 [分块]

    传送门 题意:询问区间内逆序对数 感觉这种题都成套路题了 两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个 f我直接处理成到元素j,方便一点 用个树状数 ...

  7. BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)

    题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...

  8. BZOJ 3744 Gty的妹子序列 做法集结

    我只会O(nnlogn)O(n\sqrt nlogn)O(nn​logn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nn​logn) 搬来 ...

  9. BZOJ 3744 Gty的妹子序列 分块+树状数组

    具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nn​logn) CODE #include <cmath> #include <cctyp ...

随机推荐

  1. Java 数据结构之双向链表

    一.概述: 1.什么是双向链表: 链表中的每个节点即指向前面一个节点,也指向后面一个节点,就像丢手绢游戏一样,每个人都手拉手 2.从头部插入 要对链表进行判断,如果为空则设置尾节点为新添加的节点,如果 ...

  2. HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (二)

    接上篇 HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (一) 整个 ppt 可以去这里下载. 这一篇主要从服务端应该如何返回合理的返回值的角度,讨论如何设计一个合理的 HTTP ...

  3. 又是新动作!微信小程序专属二维码出炉

    又到了晚上,微信又给我们带来了惊喜,并这次不是新的能力,而是把大家再熟悉不过的二维码换了新的造型. 正式揭晓:微信特制的小程序码.扫一扫新二维码 只要你的微信升级到了 6.5.7 版本,就可以扫码或者 ...

  4. android项目1:打电话

    android项目1:打电话 一.效果图 二.步骤 1.画好主界面 /call/res/layout/activity_main.xml <?xml version="1.0" ...

  5. 二十四 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

  6. maven-surefire-plugin的forkMode分析

    Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的.forkmode属性中指明是要为每个测试创建一个进程,还是所有测试在同一个进程中完成. <p ...

  7. Linux用root强制踢掉已登录用户;用fail2ban阻止ssh暴力破解root密码

    Linux用root强制踢掉已登录用户   首先使用w命令查看所有在线用户: [root@VM_152_184_centos /]# w 20:50:14 up 9 days, 5:58, 3 use ...

  8. vuejs绑定img 的src

    1.显示本地图片: <img src="../../common/images/auth-icon.png" />   2.绑定变量: <img class=&q ...

  9. VS2010制作安装程序

    转自(http://blog.csdn.net/wenmang1977/article/details/7733685) 序 前些天想写一下制作安装程序,由于要写的内容比较多,一拖再拖,不过坚持就是胜 ...

  10. 【河南省第十一届ACM程序设计大赛-A】计划日

    已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 输入 第一行: T        表示以下有T组测试数据         ...