传送门

题意:单点修改,询问区间内逆序对数,强制在线


看到加了!就说明花了不少时间....

如果和上题一样预处理信息,用$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的文艺妹子序列 [分块 树状数组!]的更多相关文章

  1. BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)

    题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...

  2. BZOJ3787:Gty的文艺妹子序列(分块,树状数组)

    Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...

  3. BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】

    题目分析: 首先这种乱七八糟的题目就分块.然后考虑逆序对的统计. 一是块内的,二是块之间的,三是一个块内一个块外,四是都在块外. 令分块大小为$S$. 块内的容易维护,单次维护时间是$O(S)$. 块 ...

  4. BZOJ 3787: Gty的文艺妹子序列

    3787: Gty的文艺妹子序列 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 186  Solved: 58[Submit][Status][Dis ...

  5. 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树

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

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

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

  7. 【BZOJ3744】Gty的妹子序列 分块+树状数组

    [BZOJ3744]Gty的妹子序列 Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzo ...

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

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

  9. BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!

    真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记 ...

随机推荐

  1. C语言单向链表

    1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...

  2. easyUI返回类型total,rows

  3. 基于Vue的页面切换左右滑动效果

    HTML文本页面: <template> <div id="app> <transition :name="direction" mode= ...

  4. WinSCP怎么导入filezilla中的站点?

    WinSCP是一款优秀的图形界面,远程文件管理工具,其出色的图形化界面与windows完美集成,是运用在windows上与远程服务器安全传输文件的软件之一 工具/原料 winscp 方法/步骤 下载. ...

  5. 请问:关于织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表的问题

    要设置织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表, 就按照如下图所示的方法进行操作,为什么 点击导航上的父栏目出现死循环呢, 根本浏览不了网页. 请各位大神指点指点,为什么点击 ...

  6. 单独编译IMX6Q的VPU示例程序:mxc_vpu_test.out

    mxc_vpu_test.out是飞思卡尔为IMX6Q编写的VPU示例程序,有编解码和简单的网络传输功能. 首先从/opt/freescale/pkgs/中提取出imx-test-3.0.35-4.1 ...

  7. mysql 两个时间段的差,可以是秒,天,星期,月份,年...

    SELECT TIMESTAMPDIFF(SECOND, now(), "2012-11-11 00:00:00") 语法为:TIMESTAMPDIFF(unit,datetime ...

  8. vue源码入口文件分析

    开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!! 看源码我个人感觉非常 ...

  9. Appium移动自动化测试之—基于java的iOS环境搭建

    本文仅供参考,同时感谢帮助我搭建环境的同事 操作系统的名称:Mac OS X操作系统的版本:10.12.6 接下来我们开始踏上搭建Appium+java+ios之路,本文只说个大概,毕竟本机已经装过了 ...

  10. JavaScript String(字符串对象)

    String 对字符串的支持 String.charAt( n ) 返回字符串中的第n个字符 n 是下标 String.charCodeAt( ) 返回字符串中的第n个字符的代码 String.con ...