传送门

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


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

如果和上题一样预处理信息,用$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. Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用

    摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...

  2. [国嵌攻略][163][linux-usb软件系统架构]

    软件系统架构 1.主机端软件架构 USB设备驱动->USB核心->USB主控制器驱动->USB主控制器 2.设备端软件架构 Gadget驱动->Gadget API->U ...

  3. WdatePicker时间插件

    next_door_boy CnBlogs Home New Post Contact Admin Rss Posts - 14  Articles - 5  Comments - 0  WdateP ...

  4. alert一般用来调试客户端的javascript代码,以及更好的调试方法

    alert一般用来调试客户端的javascript代码 调试利器--console.log 如今主流浏览器(Chrome,IE8及后续版本,FireFox,Opera等)都支持控制台功能. Chrom ...

  5. J.U.C atomic 数组,字段原子操作

    这里看一下原子数组操作和一些其他的原子操作. AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择代表性的AtomicInt ...

  6. mysql alter总结

    mysql alter总结(转载) 1:删除列 ALTER TABLE [表名字] DROP [列名称] 2:增加列 ALTER TABLE [表名字] ADD [列名称] INT NOT NULL  ...

  7. 数据结构 哈希表(Hash Table)_哈希概述

    哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...

  8. Angular19 自定义表单控件

    1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...

  9. 记录一次tomcat下项目没有加载成功

    哥们儿实在太low了,web.xml文件中加载的spring mybatis配置文件和配置的文件不是同一个文件名导致的!

  10. Web Magic设计思想

    1.1 设计思想 1. 一个框架,一个领域 一个好的框架必然凝聚了领域知识.WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应用了HttpClient.Jsoup等Java世界最成熟 ...