[TJOI2017]不勤劳的图书管理员(分块+树状数组)
有一个数组开大会MLE开小会RE的做法:就是树套树,即树状数组套主席树,这种方法比较暴力,然而很遗憾它不能通过,因为其时空复杂度均为O(nlog2n)。
想到一种不怎么耗内存,以时间换空间,分块!单次修改(l,r)只对点对(l,r)、(l,i)和(i,r)产生影响,其中l<i<r,然后可以考虑分块,每块维护每个p[i]出现的次数,交换时块内直接查询即可,而修改也可以直接修改,套上树状数组即可在O(logn)内的时间维护。设块大小为k,时间复杂度为O(nlogn+mk+mnlogn/k),当k取√(nlogn)时,复杂度最优,此时复杂度为O(nlogn+m√(nlogn))。空间复杂度也不会爆炸,为O(n√n)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+,mod=1e9+;
int n,m,B,p[N];
ll ans,s[][][N],v[N];
void add(int t,int id,int x,ll v)
{
if(!x)return;
while(x<=n)s[t][id][x]=(s[t][id][x]+v+mod)%mod,x+=x&-x;
}
ll ask(int t,int id,int x)
{
if(x<)return ;
ll ret=;while(x)ret=(ret+s[t][id][x])%mod,x-=x&-x;
return ret;
}
void calc(int a,int b,int c)
{
if(p[a]<p[c])ans=(ans+v[a]+v[c])%mod;else ans=(ans-v[a]-v[c]+*mod)%mod;
if(p[b]<p[c])ans=(ans-v[b]-v[c]+*mod)%mod;else ans=(ans+v[b]+v[c])%mod;
}
int main()
{
scanf("%d%d",&n,&m),B=sqrt(n*);
for(int i=;i<n;i++)scanf("%d%lld",&p[i],&v[i]),add(,i/B,p[i],v[i]),add(,i/B,p[i],);
for(int i=n-;~i;i--)
{
ans=(ans+ask(,n/B+,p[i])+ask(,n/B+,p[i])*v[i])%mod;
add(,n/B+,p[i],v[i]),add(,n/B+,p[i],);
}
while(m--)
{
int x,y,idx,idy;scanf("%d%d",&x,&y),x--,y--;
if(x==y){printf("%lld\n",ans);continue;}
if(x>y)swap(x,y);
idx=x/B,idy=y/B;
if(p[x]<p[y])ans=(ans+v[x]+v[y])%mod;else ans=(ans-v[x]-v[y]+*mod)%mod;
if(idx==idy)
{
for(int j=x+;j<y;j++)calc(x,y,j);
swap(p[x],p[y]),swap(v[x],v[y]);
printf("%lld\n",ans);
continue;
}
for(int j=x+;j<idx*B+B;j++)calc(x,y,j);
for(int j=idy*B;j<y;j++)calc(x,y,j);
for(int j=idx+;j<idy;j++)
{
ans=(ans-*ask(,j,p[x])+ask(,j,n)-(*ask(,j,p[x])-B+mod)*v[x]%mod+mod)%mod;
ans=(ans+*ask(,j,p[y])-ask(,j,n)+(*ask(,j,p[y])-B+mod)*v[y]%mod+mod)%mod;
}
add(,idx,p[x],-v[x]),add(,idy,p[y],-v[y]),add(,idx,p[x],-),add(,idy,p[y],-);
swap(p[x],p[y]),swap(v[x],v[y]);
add(,idx,p[x],v[x]),add(,idy,p[y],v[y]),add(,idx,p[x],),add(,idy,p[y],);
printf("%lld\n",ans);
}
}
[TJOI2017]不勤劳的图书管理员(分块+树状数组)的更多相关文章
- 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组
[BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...
- [P3759][TJOI2017]不勤劳的图书管理员(分块+树状数组)
题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生 这两本书页数的和的厌烦度.现在有n本被打乱顺序的书 ...
- 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】
题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...
- 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT
[bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...
- bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)
传送门 据说正解线段树套平衡树 然而网上参考(抄)了一个树状数组套动态开点线段树的 思路比较清楚,看代码应该就明白了 //minamoto #include<iostream> #incl ...
- 【洛谷3759】[TJOI2017] 不勤劳的图书管理员(树套树)
点此看题面 大致题意: 给定一个序列,每个元素有两个属性\(a_i\)和\(v_i\),每次操作改变两个元素的位置,求每次操作后\(\sum{v_i+v_j}[i<j,a_i>a_j]\) ...
- 【loj2639】[Tjoi2017]不勤劳的图书管理员
#2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产 ...
- 洛谷P3759 - [TJOI2017]不勤劳的图书管理员
Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...
- 【BZOJ4889】不勤劳的图书管理员(树套树)
[BZOJ4889]不勤劳的图书管理员(树套树) 题面 又是权限题,烦死了 洛谷真好 题解 分开考虑每一次交换产生的贡献. 假设交换\((x,y)\) 检查\(x\)与\(y\)对于区间\([x+1, ...
- 【BZOJ 3295】动态逆序对 - 分块+树状数组
题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...
随机推荐
- 10几行代码,用python打造实时截图识别OCR
你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率. ! 今天,我们就来做一款实时截图识别的小工具.顾名思义,运行程序时,可以实时的把你截出来的图片中的文字识别出来. 下 ...
- javascript 连续赋值(连等运算)问题研究
前几天看到一个javascript 连续赋值的问题,运行了一下,结果出乎意料,发现这里的水真的有点深啊,连续赋值的底层机制,没有一本前端书籍有详细介绍的,自己做实验研究了一下,先来看结果: var a ...
- StringBuffer类、StringBuilder类详解
StringBuffer是一个字符串缓冲区,是一个容器,而且长度可变,可以直接操作多个数据类型, 最终会通过toString()方法变成字符串. 容器的功能有: 1.存储 public StringB ...
- (BUILDER)建造者与(FACTORY)工厂模式 的比较
首先,说明下 参考博文 1. 建造者 http://www.cnblogs.com/zhili/p/BuilderPattern.html 2. 抽象工厂 http://www ...
- Ubuntu系统下QEMU环境搭建
(这篇文章是在搭建QEMU环境时,在网上找到了一些教程资料,并在实际操作中遇到的一些问题的整理) 下载Linux内核 下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发.另一种是 ...
- 68.ORM查询条件:date,time,year,week_day等
1. date: 首先查看数据库中article表的信息,由表中的create_time字段可以看出时间为2020.2.5 打印出查询的结果: <QuerySet []>:但是查询的结果为 ...
- MySQL数据库索引常见问题
笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+ ...
- VMware DRS部分知识点
主机添加到集群中,不需要维护模式(有虚拟机开机状态时也可以添加进去). 主机从集群中移除,需要主机进入维护模式. HA和DRS 全自动 当设置虚拟机必须在主机上时 DRS优先级大于HA 就算主机挂了H ...
- Linux安装已编译好的FFmpeg,基于centos7
1.访问https://johnvansickle.com/ffmpeg/ 2.下载地址:https://johnvansickle.com/ffmpeg/releases/ffmpeg-releas ...
- h5-钟表动画案例
1.html代码 <div class="clock"> <div class="line line1"> <div class= ...