浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4889

树状数组套线段树搞一搞就好了。

时间复杂度:\(O(nlog^2n)\)

空间复杂度:\(O(nlog^2n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii;
#define low(i) ((i)&(-(i)))
#define fr first
#define sc second const int maxn=5e4+5,pps=1e9+7; int n,m,ans;
int pos[maxn],v[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct segment_tree {
int tot;
pii tree[maxn*200];
int ls[maxn*200],rs[maxn*200]; void change(int p,int l,int r,int pos,int v,int cnt) {
while(1) {
tree[p].fr=(tree[p].fr+v)%pps;
tree[p].sc+=cnt;if(l==r)break;
int mid=(l+r)>>1;
if(pos<=mid) {
if(!ls[p])ls[p]=++tot;
r=mid,p=ls[p];
}
else {
if(!rs[p])rs[p]=++tot;
l=mid+1,p=rs[p];
}
}
}
}T; struct TreeArray {
int cnt1,cnt2;
int rt[maxn],u1[maxn],u2[maxn]; void change(int pos,int key1,int key2,int cnt) {
for(int i=pos;i<=n;i+=low(i)) {
if(!rt[i])rt[i]=++T.tot;
T.change(rt[i],1,n,key1,key2,cnt);
}
} int query(int L,int R,int pos,int val,int opt) {
if(R<=L)return 0;
cnt1=cnt2=0;pii res;res.fr=res.sc=0;
for(int i=L;i;i-=low(i))u1[++cnt1]=rt[i];
for(int i=R;i;i-=low(i))u2[++cnt2]=rt[i];
int l=1,r=n;
while(l!=r) {
int mid=(l+r)>>1;
if(pos<=mid) {
if(opt) {
for(int i=1;i<=cnt1;i++) {
int u=T.rs[u1[i]];
res.fr=(res.fr-T.tree[u].fr+pps)%pps;
res.sc=res.sc-T.tree[u].sc;
}
for(int i=1;i<=cnt2;i++) {
int u=T.rs[u2[i]];
res.fr=(res.fr+T.tree[u].fr)%pps;
res.sc=res.sc+T.tree[u].sc;
}
}
r=mid;
for(int i=1;i<=cnt1;i++)u1[i]=T.ls[u1[i]];
for(int i=1;i<=cnt2;i++)u2[i]=T.ls[u2[i]];
}
else {
if(!opt) {
for(int i=1;i<=cnt1;i++) {
int u=T.ls[u1[i]];
res.fr=(res.fr-T.tree[u].fr)%pps;
res.sc=res.sc-T.tree[u].sc;
}
for(int i=1;i<=cnt2;i++) {
int u=T.ls[u2[i]];
res.fr=(res.fr+T.tree[u].fr)%pps;
res.sc=res.sc+T.tree[u].sc;
}
}
l=mid+1;
for(int i=1;i<=cnt1;i++)u1[i]=T.rs[u1[i]];
for(int i=1;i<=cnt2;i++)u2[i]=T.rs[u2[i]];
}
}
return (res.fr+1ll*res.sc*val%pps)%pps;
}
}bit; int main() {
n=read(),m=read();
for(int i=1;i<=n;i++) {
pos[i]=read(),v[i]=read();
ans=(ans+bit.query(0,i-1,pos[i],v[i],1))%pps;
bit.change(i,pos[i],v[i],1);
}
for(int i=1;i<=m;i++) {
int x=read(),y=read();
if(x>y)swap(x,y);
ans=(ans-bit.query(x,y-1,pos[y],v[y],1)+pps)%pps;
ans=(ans-bit.query(x,y-1,pos[x],v[x],0)+pps)%pps;
ans=(ans+bit.query(x,y-1,pos[y],v[y],0))%pps;
ans=(ans+bit.query(x,y-1,pos[x],v[x],1))%pps;
if(pos[x]>pos[y])ans=(ans-v[x]-v[y]+pps)%pps;
else if(pos[x]<pos[y])ans=(ans+v[x]+v[y])%pps;
bit.change(x,pos[x],-v[x],-1),bit.change(y,pos[y],-v[y],-1);
bit.change(x,pos[y],v[y],1),bit.change(y,pos[x],v[x],1);
swap(pos[x],pos[y]),swap(v[x],v[y]);
printf("%d\n",ans);
}
return 0;
}

BZOJ4889:[TJOI2017]不勤劳的图书管理员的更多相关文章

  1. [bzoj4889] [Tjoi2017]不勤劳的图书管理员

    Description 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被 ...

  2. bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)

    传送门 据说正解线段树套平衡树 然而网上参考(抄)了一个树状数组套动态开点线段树的 思路比较清楚,看代码应该就明白了 //minamoto #include<iostream> #incl ...

  3. 【bzoj4889】: [Tjoi2017]不勤劳的图书管理员 分块-BIT

    [bzoj4889]: [Tjoi2017]不勤劳的图书管理员 题目大意:给定一个序列(n<=50000),每个数有一个编码ai(ai<=50000)和权值vi(vi<=100000 ...

  4. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组

    [BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...

  5. 【BZOJ4889】不勤劳的图书管理员(树套树)

    [BZOJ4889]不勤劳的图书管理员(树套树) 题面 又是权限题,烦死了 洛谷真好 题解 分开考虑每一次交换产生的贡献. 假设交换\((x,y)\) 检查\(x\)与\(y\)对于区间\([x+1, ...

  6. 洛谷P3759 - [TJOI2017]不勤劳的图书管理员

    Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...

  7. 【loj2639】[Tjoi2017]不勤劳的图书管理员

    #2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产 ...

  8. BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4889 https://www.luogu.org/problemnew/show/P3759 加里 ...

  9. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

随机推荐

  1. Spring Boot 从入门到实战汇总

    之前写过几篇spring boot入门到实战的博文,因为某些原因没能继续. 框架更新迭代很快,之前还是基于1.x,现在2.x都出来很久了.还是希望能从基于该框架项目开发的整体有一个比较系统的梳理,于是 ...

  2. CSS3 实现背景透明,文字不透明,兼容所有浏览器

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>opac ...

  3. linux查看某个时间段的log

    若想在linux下查询某个时间段的log,用sed命令示例如下: $ sed -n '/2017-01-04 11:00:00/,/2017-01-04 11:20:55/p'  ejabberd.l ...

  4. Linux 文件系统IO性能优化

    对于LINUX SA来说,服务器性能是需要我们特别关注的,包括CPU.IO.内存等等系统的优化变得至关重要,这里转载一篇非常不错的关于IO优化的文章,供大家参考和学习: 一.关于页面缓存的信息,可以用 ...

  5. 成长型思维模式Not yet

    当做一件事失败了,要告诉他 暂未成功,暂时没有成功,继续努力,下次就有可能成功. 不及格,暂未及格  是两种思维模式,成长性的思维方式得到的是一个是努力型的人格

  6. 利用python进行数据分析之pandas入门

    转自https://zhuanlan.zhihu.com/p/26100976 目录: 5.1 pandas 的数据结构介绍5.1.1 Series5.1.2 DataFrame5.1.3索引对象5. ...

  7. Node.js面试题

    Node.js面试题列表 什么是错误优先的回调函数? 如何避免回调地狱? 如何用Node来监听80端口? 什么是事件循环? 哪些工具可以用来保证一致的编程风格? 什么是测试金字塔?对于HTTP API ...

  8. PYTHON加密解密字符串

    依赖包安装部分 安装依赖包: pip install pycryptodome 在你的python环境中的下图红框路径中找到 crypto 将其改成 Crypto 代码部分 #!/usr/bin/en ...

  9. 小记tensorflow-1:tf.nn.conv2d 函数介绍

    tf.nn.conv2d函数介绍 Input: 输入的input必须为一个4d tensor,而且每个input的格式必须为float32 或者float64. Input=[batchsize,im ...

  10. 3D特效焦点图

    在线演示 本地下载