BZOJ 3744: Gty的妹子序列 [分块]
题意:询问区间内逆序对数
感觉这种题都成套路题了
两个预处理$f[i][j]$块i到j的逆序对数,$s[i][j]$前i块$\le j$的有多少个
f我直接处理成到元素j,方便一点
用个树状数组就行了
预处理和查询都带$log$所以还是开根号n比较科学吧
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=5e4+, M=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
} int n, a[N], Q, mp[N], l, r;
struct meow{int l,r;} b[M];
int block, m, pos[N];
inline void ini(){
block=sqrt(n); m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
for(int i=;i<=m;i++) b[i].l=(i-)*block+, b[i].r=i*block;
b[m].r=n;
}
struct Block{
int c[N];
inline void add(int p,int v) {for(;p<=*mp;p+=(p&-p)) c[p]+=v;}
inline int sum(int p) {int re=; for(;p;p-=(p&-p)) re+=c[p]; return re;}
int f[M][N], s[M][N];
void Set(int x){
for(int i=b[x].l; i<=n; i++)
f[x][i]= f[x][i-]+sum(*mp)-sum(a[i]), add(a[i], );// printf("f %d %d %d\n",x,i,f[x][i]);
memset(c, , sizeof(c)); for(int i=b[x].l; i<=b[x].r; i++) s[x][a[i]]++;
for(int i=; i<=*mp; i++) s[x][i]+= s[x][i-];
for(int i=; i<=*mp; i++) s[x][i]+= s[x-][i];// printf("s %d %d %d\n",x,i,s[x][i]);;
} int Que(int l,int r){
int pl=pos[l], pr=pos[r];
int ans=;
if(pl==pr){
for(int i=l;i<=r;i++) ans+= sum(*mp)-sum(a[i]), add(a[i], );
for(int i=l;i<=r;i++) add(a[i], -);
}else{
ans= f[pl+][r]; //printf("ans %d \n",ans);
for(int i=b[pr].l; i<=r; i++) add(a[i], );
for(int i=b[pl].r; i>=l; i--) ans+= sum(a[i]-) + s[pr-][a[i]-] - s[pl][a[i]-], add(a[i], );
for(int i=b[pr].l; i<=r; i++) add(a[i], -);
for(int i=l; i<=b[pl].r; i++) add(a[i], -);
}
return ans;
}
}B;
int main(){
freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=mp[i]=read();
sort(mp+, mp++n); *mp=unique(mp+, mp++n) - mp - ;
for(int i=;i<=n;i++) a[i]=lower_bound(mp+, mp++*mp, a[i]) - mp;
//for(int i=1;i<=n;i++) printf("%d ",a[i]); puts("");
ini();
for(int i=;i<=m;i++) B.Set(i); Q=read(); int lastans=;
while(Q--){
//l=read(), r=read();
l=read()^lastans, r=read()^lastans;
if(l>r) swap(l, r);
lastans=B.Que(l, r); printf("%d\n",lastans);
}
}
BZOJ 3744: Gty的妹子序列 [分块]的更多相关文章
- BZOJ 3744 Gty的妹子序列 (分块 + BIT)
3744: Gty的妹子序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1931 Solved: 570[Submit][Status][Dis ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
- bzoj 3744: Gty的妹子序列 主席树+分块
3744: Gty的妹子序列 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 101 Solved: 34[Submit][Status] Descr ...
- BZOJ 3744 Gty的妹子序列
Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...
- bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...
- BZOJ - 3744 Gty的妹子序列 (区间逆序对数,分块)
题目链接 静态区间逆序对数查询,这道题用线段树貌似不好做,可以把区间分成$\sqrt n$块,预处理出两个数组:$sum[i][j]$和$inv[i][j]$,$sum[i][j]$表示前i个块中小于 ...
- BZOJ 3744 Gty的妹子序列 做法集结
我只会O(nnlogn)O(n\sqrt nlogn)O(nnlogn)的 . . . . 这是分块+树状数组+主席树的做法O(nnlogn)O(n\sqrt nlogn)O(nnlogn) 搬来 ...
随机推荐
- 2017ecjtu-summer training #4 UESTC 1584
此题链接 http://acm.uestc.edu.cn/#/problem/show/1584 此题和hdu1541几乎完全一样,我们要先对坐标排序,再进行操作. hdu1541题解 http:// ...
- HDU--2024
C语言合法标识符 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- [国嵌攻略][142][LCD驱动程序架构]
LCD裸机驱动回顾 1.LCD初始化 1.1.控制器初始化 1.2.端口初始化 1.3.指明了帧缓冲 2.LCD图形显示 2.1.将图形数据写入帧缓冲 Linux帧缓冲体验 把图片转换成开发板屏对应的 ...
- HashSet,LinkedHashSet,TreeSet的区别
Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...
- PageRank_网页排名_MapReduceJava代码实现思路
PageRank 1. 概念 2. 原理 3. java代码实现思路 1.定义收敛标准 每次算出新的pr-oldpr=差值 ,所有页面的差值累加 ,除以pagecou ...
- HtmlHelper总结
HTML helper是在视图页面上操作HTML元素时可以调用的方法,还包括URL helper和AJAX helper.这些帮助方法都为了使得操作HTML更加容易.分为两类:a.编辑和输入帮助类b. ...
- 如何利用vue和php做前后端分离开发?
新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...
- MySQL改写子查询成Join
有时用别的方式而不是子查询可以获得更高的性能 : For example: SELECT * FROM t1 WHERE id IN (SELECT id FROM t2); 改写: SELECT D ...
- javascript学习日志:前言
javascript学习日志系列的所有博客,主要理论依据是<javascript权威指南>(犀牛书第6版)以及<javascript高级程序设计第三版>(红色书),目前js行业 ...
- org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcessor
这几天来公司,公司的SVN坏掉了,然后项目还比较大,是一个分布式的,然后同事就把项目发我了.我在myeclipse里面导入项目了,把相应的jar包也建了个人的library导入了项目,现在项目不报错了 ...