BZOJ 3787: Gty的文艺妹子序列 [分块 树状数组!]
题意:单点修改,询问区间内逆序对数,强制在线
看到加了!就说明花了不少时间....
如果和上题一样预处理信息,用$f[i][j]$表示块i到j的逆序对数
强行修改的话,每个修改最多会修改$(\frac{N}{S})^2$个信息,可以通过$S=N^{\frac{2}{3}}$达到$O(N^{\frac{5}{3}})$
但是我们可以更快
令$S=\sqrt{N}$
如果我们用$f[i][j]$表示一个块i中元素与一个块j中元素组成的逆序对数,一次修改就只会修改$\sqrt{N}$个信息啦
询问的时候,第二维套上一个树上数组,复杂度只是加上一个$log$而已
$s[i][j]$表示前i块中j出现次数,同理
我在哪里出问题了呢?$f$预处理错了,没有按照上面的意义来预处理,唉~
#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, l, r, op, p, v, col;
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 BIT1{
int c[M], n;
inline void add(int p,int v) {for(;p<=n;p+=(p&-p)) c[p]+=v;}
inline int sum(int p) {int re=; for(;p;p-=(p&-p)) re+=c[p]; return re;}
inline int que(int l,int r) {return sum(r) - sum(l-);}
};
struct BIT2{
int c[N], n;
inline void add(int p,int v) {for(;p<=n;p+=(p&-p)) c[p]+=v;}
inline int sum(int p) {int re=; for(;p;p-=(p&-p)) re+=c[p]; return re;}
inline int que(int l,int r) {return sum(r) - sum(l-);}
}; struct Block{
BIT1 f[M]; BIT2 s[M], C;
void ini(){
for(int i=;i<=m;i++) f[i].n=m, s[i].n=col;
C.n=col;
} void Set(int x){
for(int i=b[x].l; i<=b[x].r; i++)
f[x].add(x, C.que(a[i]+, col) ), C.add(a[i], );
for(int t=x+; t<=m; t++)
for(int i=b[t].l; i<=b[t].r; i++) f[x].add(t, C.que(a[i]+, col) ); for(int i=b[x].l; i<=b[x].r; i++) C.add(a[i], -); //for(int i=1; i<=col; i++) s[x].add(i, s[x-1].que(i, i) );
for(int i=; i<=col; i++) s[x].c[i]= s[x-].c[i];
for(int i=b[x].l; i<=b[x].r; i++) s[x].add(a[i], );
} inline int cal(int x,int y,int l,int r) {return s[y].que(l, r) - s[x-].que(l, r);} int Que(int l, int r){ //printf("Que %d %d\n",l,r);
int pl=pos[l], pr=pos[r];
int ans=;
if(pl==pr){
for(int i=l; i<=r; i++) ans+= C.que(a[i]+, col), C.add(a[i], );
for(int i=l; i<=r; i++) C.add(a[i], -);
}else{
for(int x=pl+; x<pr; x++) ans+= f[x].que(x, pr-);// printf("f %d %d %d\n",x,pr-1,f[x].que(x, pr-1));
//for(int i=1;i<=m;i++) printf("lalala %d %d\n",i,f[i].que(i, i+1) ); //printf("ans %d\n",ans); for(int i=b[pr].l; i<=r; i++)
ans += C.que(a[i]+, col) + cal(pl+, pr-, a[i]+, col), C.add(a[i], );
//printf("hiaaa %d %d %d %d\n",pr-1, pl, s[pr-1].que(a[i]+1, col) , s[pl].que(a[i]+1, col));
//printf("ans %d\n",ans);
for(int i=b[pl].r; i>=l; i--)
ans+= C.sum(a[i]-) + cal(pl+, pr-, , a[i]-), C.add(a[i], );
for(int i=b[pr].l; i<=r; i++) C.add(a[i], -);
for(int i=l; i<=b[pl].r; i++) C.add(a[i], -);
}
return ans;
} void Cha(int p, int v){ //printf("Cha %d %d\n",p,v);
int x=pos[p];
f[x].add(x, -f[x].que(x, x));
int _=a[p]; a[p]=v;
for(int i=b[x].l; i<=b[x].r; i++) f[x].add(x, C.que(a[i]+, col) ), C.add(a[i], );
for(int i=b[x].l; i<=b[x].r; i++) C.add(a[i], -); for(int t=x+; t<=m; t++)
f[x].add(t, -cal(t, t, , _-) ), f[x].add(t, cal(t, t, , v-) );
for(int t=; t<x; t++)
f[t].add(x, -cal(t, t, _+, col) ), f[t].add(x, cal(t, t, v+, col) ); for(int t=x; t<=m; t++) s[t].add(_, -), s[t].add(v, );
}
}B; int candy;
inline void debug() {
// printf("a ");for(int i=1;i<=n;i++) printf("%d ",a[i]); puts("");
}
int main(){
freopen("in","r",stdin);
n=read(); col=n;
for(int i=;i<=n;i++) a[i]=read(); ini();
B.ini();
for(int i=;i<=m;i++) B.Set(i);
//for(int i=1;i<=n;i++) printf("%d ",pos[i]);puts(""); Q=read(); int lastans=;
//candy=1;
while(Q--){
debug();
op=read();
if(op==){
if(candy) l=read(), r=read();
else l=read()^lastans, r=read()^lastans;
lastans=B.Que(l, r); printf("%d\n",lastans);
}else{
if(candy) p=read(), v=read();
else p=read()^lastans, v=read()^lastans;
B.Cha(p, v);
}
}
}
BZOJ 3787: Gty的文艺妹子序列 [分块 树状数组!]的更多相关文章
- BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)
题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...
- BZOJ3787:Gty的文艺妹子序列(分块,树状数组)
Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...
- BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】
题目分析: 首先这种乱七八糟的题目就分块.然后考虑逆序对的统计. 一是块内的,二是块之间的,三是一个块内一个块外,四是都在块外. 令分块大小为$S$. 块内的容易维护,单次维护时间是$O(S)$. 块 ...
- BZOJ 3787: Gty的文艺妹子序列
3787: Gty的文艺妹子序列 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 186 Solved: 58[Submit][Status][Dis ...
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- 【BZOJ3744】Gty的妹子序列 分块+树状数组
[BZOJ3744]Gty的妹子序列 Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzo ...
- BZOJ 3744 Gty的妹子序列 分块+树状数组
具体分析见 搬来大佬博客 时间复杂度 O(nnlogn)O(n\sqrt nlogn)O(nnlogn) CODE #include <cmath> #include <cctyp ...
- BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!
真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记 ...
随机推荐
- centos7 hue安装
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- python基础2 day3
一.上节回顾 1,while else2,格式化输出name = input('>>>')s1 = '我叫%s,今年%d岁'%(name,18)dic1name = input('& ...
- GitHub上传文件或项目的教程
既然是往GitHub上传文件,那GitHub账号必须得有,这时候就会有同学问:妖怪吧,我没有GitHub账号怎么办? 别急别急,打开GitHub网站https://github.com/,然后注册就O ...
- 立即掌握SSM框架的要诀
ssm框架的总结: 1. 首先是POM.xml 文件的配置,他的作用主要是添加依懒的关系和自动下载相关的包. 2.对jdbc.properties进行配置 ,作用就是连接你的数据库的配置. 3.对接着 ...
- Mac OS启动服务优化高级篇
一.Mac下的启动服务主要三个可配置的地方 1.系统偏好设置->帐户->登陆项 2./System/Library/StartupItems 和 /Library/StartupItems ...
- UE4/Unity3D中同时捕获多高清摄像头的高效插件
本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...
- 《HelloGitHub》第 22 期
公告 年前最后一期,下次就是年后了,老时间 每月的 28 号,年后见- <HelloGitHub>第 22 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 G ...
- 深入剖析Java编程中的中文问题及建议最优解决方法
摘录自:http://fafeng.blogbus.com/logs/3062998.html http://www.blogbus.com/fafeng-logs/3063006.html 深入剖析 ...
- MySQL Command Line Client显示中文的部分为空
一连接数据库的时候就设置如下: 先设置 set names gbk,然后再插入就显示中文
- python 导入模块错误
问题: 导入一些模块或者运行第三方软件的时候,会出现一下类似错误: ImportError: No module named future.utils 问题原因: 没有安装第三方库 future,这个 ...