[bzoj4889] [Tjoi2017]不勤劳的图书管理员
Description
加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员。他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度。现在有n本被打乱顺序的书,在接下来m天中每天都会因为读者的阅览导致书籍顺序改变位置。因为小豆被要求在接下来的m天中至少要整理一次图书。小豆想知道,如果他前i天不去整理,第i天他的厌烦度是多少,这样他好选择厌烦度最小的那天去整理。
Input
第一行会有两个数,n,m分别表示有n本书,m天
接下来n行,每行两个数,ai和vi,分别表示第i本书本来应该放在ai的位置,这本书有vi页,保证不会有放置同一个位置的书
接下来m行,每行两个数,xj和yj,表示在第j天的第xj本书会和第yj本书会因为读者阅读交换位置
Output
一共m行,每行一个数,第i行表示前i天不去整理,第i天小豆的厌烦度,因为这个数可能很大,所以将结果模10^9 +7后输出
Sample Input
5 5
1 1
2 2
3 3
4 4
5 5
1 5
1 5
2 4
5 3
1 3
Sample Output
42
0
18
28
48
HINT
对于20%的数据,1 ≤ ai; xj; yj ≤ n ≤ 5000, m ≤ 5000, vi ≤ 10^5
对于100%的数据,1 ≤ ai; xj; yj ≤ n ≤ 50000, m ≤ 50000, vi ≤ 10^5
solution
话说\(bzoj\)没有题面是什么操作啊。。
题目其实就是让你维护动态的逆序对。
注意到每次\(swap(l,r)\),只会改变\(\forall \, i \in \, [l+1,r-1]\),\((l,i)\&(i,r)\) 这些二元组的贡献,
所以可以维护一个全局变量\(ans\)统计答案,然后用树状数组套动态开点的权值线段树来维护就行了。
具体的,对于每个线段树维护\(x\)到\(y\)的权值,记录一个\(sum\)表示\(b_i\)的和,\(num\)表示有多少个。
然后对于\(l\)的贡献就是\([l+1,r-1]\)当中\(b_i\)范围在 \((0,a_l-1]\)内的 \(sum\) 加上 $num \cdot b_l $,然后 \(ans\)减去这个再加上 \(swap\)后的贡献。
对于\(r\)也类似,然后就做完了。
注意少模几次,少开点\(long\,long\)啥的就能过了。
%: pragma GCC optimize(3) // 人傻常数大QAQ
#include<bits/stdc++.h>
using namespace std;#define ll long long#define void inline void
#define il inlinevoid read(int &x) {x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}void print(ll x) {if(x<0) putchar('-'),x=-x;if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(ll x) {if(!x) putchar('0');else print(x);putchar('\n');}const int maxn = 1e5+10;
const int N = 1e5;
const int mod = 1e9+7;int ls[maxn*120],rs[maxn*120],sum[maxn*120],tot,num[maxn*120];
int a[maxn],b[maxn],n,m;#define mid ((l+r)>>1)struct Segment_Tree {void modify(int &p,int l,int r,int x,int v,int val) {if(!p) p=++tot;sum[p]+=val;num[p]+=v;if(l==r) return ;if(x<=mid) modify(ls[p],l,mid,x,v,val);else modify(rs[p],mid+1,r,x,v,val);}il int query(int p,int l,int r,int x,int y) {if(!p) return 0;if(x<=l&&r<=y) return sum[p];int ans=0;if(x<=mid) ans+=query(ls[p],l,mid,x,y);if(y>mid) ans+=query(rs[p],mid+1,r,x,y);return ans;}il int query_num(int p,int l,int r,int x,int y) {if(!p) return 0;if(x<=l&&r<=y) return num[p];int ans=0;if(x<=mid) ans+=query_num(ls[p],l,mid,x,y);if(y>mid) ans+=query_num(rs[p],mid+1,r,x,y);return ans;}
};il ll dec(ll x,ll y) {if(x<y) x+=mod;return x-y;}struct Binary_Indexed_Tree {int rt[maxn];Segment_Tree SGT[maxn];void modify(int i,int x,int v,int val) {for(;i<=n;i+=i&-i) SGT[i].modify(rt[i],0,N,x,v,val);}il ll query(int l,int r,int L,int R) {if(l>r||L>R) return 0;ll ans=0;for(;r;r-=r&-r) ans+=SGT[r].query(rt[r],0,N,L,R);l--;for(;l;l-=l&-l) ans-=SGT[l].query(rt[l],0,N,L,R);return ans;}il ll query_num(int l,int r,int L,int R) {if(l>r||L>R) return 0;ll ans=0;for(;r;r-=r&-r) ans+=SGT[r].query_num(rt[r],0,N,L,R);l--;for(;l;l-=l&-l) ans-=SGT[l].query_num(rt[l],0,N,L,R);return ans;}
}BIT;int main() {read(n),read(m);ll ans=0;for(int i=1;i<=n;i++) read(a[i]),read(b[i]),BIT.modify(i,a[i],1,b[i]);for(int i=1;i<=n;i++)ans+=BIT.query(1,i-1,a[i]+1,N)+BIT.query_num(1,i-1,a[i]+1,N)*b[i];for(int x,y,i=1;i<=m;i++) {read(x),read(y);if(x>y) swap(x,y);if(x==y) {write(ans);continue;}ans=dec(ans,BIT.query(x+1,y-1,1,a[x]-1));ans=dec(ans,1ll*BIT.query_num(x+1,y-1,1,a[x]-1)*b[x]);ans=dec(ans,BIT.query(x+1,y-1,a[y]+1,N));ans=dec(ans,1ll*BIT.query_num(x+1,y-1,a[y]+1,N)*b[y]);ans=(ans+BIT.query(x+1,y-1,1,a[y]-1));ans=(ans+1ll*BIT.query_num(x+1,y-1,1,a[y]-1)*b[y]);ans=(ans+BIT.query(x+1,y-1,a[x]+1,N));ans=(ans+1ll*BIT.query_num(x+1,y-1,a[x]+1,N)*b[x])%mod;if(a[x]>a[y]) ans=(ans-b[x]-b[y])%mod;else ans=(ans+b[x]+b[y])%mod;BIT.modify(x,a[x],-1,-b[x]),BIT.modify(x,a[y],1,b[y]);BIT.modify(y,a[y],-1,-b[y]),BIT.modify(y,a[x],1,b[x]);swap(a[x],a[y]),swap(b[x],b[y]);write(ans=(ans+mod)%mod);}return 0;
}
转载于:https://www.cnblogs.com/hbyer/p/10151549.html
[bzoj4889] [Tjoi2017]不勤劳的图书管理员相关推荐
- 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组
[BZOJ4889][Tjoi2017]不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让 ...
- 【loj2639】[Tjoi2017]不勤劳的图书管理员
#2639. 「TJOI2017」不勤劳的图书管理员 题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员. 他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆 ...
- [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组
题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打乱顺序的书, ...
- 周末狂欢赛2(冒泡排序,概率充电器,不勤劳的图书管理员)
狂欢2 T1:冒泡排序 题目 题解 CODE T2:概率充电器 题目 题解 CODE T3:不勤劳的图书管理员 题目 题解 CODE 我不这么认为.... T1:冒泡排序 题目 下面是一段实现冒泡排序 ...
- springboot图书管理怎么实现借书时间到期提醒_智能机器人充当图书管理员,看看它能干嘛...
想必大家都去过图书馆吧,每当出现一些问题时,大家都会询问图书管理员.说起图书管理员的工作,大多数人的印象是强度大.单调且单一.重复性强.效率低.如果智能机器人走进图书馆,当起了图书管理员了,现状将完全 ...
- 图书管理员【2017年普及组第二题】
图书管理员图书管理员图书管理员 题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图书编 ...
- my-medium.cnf_您的手机如何打开medium.com-我将让门卫和图书管理员解释。
my-medium.cnf by Andrea Zanin 由Andrea Zanin 您的手机如何打开medium.com-我将让门卫和图书管理员解释. (How your phone opens ...
- 牛客题库 题解 | #[NOIP2017]图书管理员#
链接:#[NOIP2017]图书管理员# 题目牛客网是互联网求职神器,C++.Java.前端.产品.运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨 ...
- P3955 [NOIP2017 普及组] 图书管理员C++题解
洛谷来源:P3955 [NOIP2017 普及组] 图书管理员 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/sol ...
最新文章
- jpg怎么合成一份_哪些超实用的有机化学知识点---之有机合成工具包
- 成长轨迹59 【ACM算法之路 百炼poj.grids.cn】【递归】【2694:逆波兰表达式】
- AntData.ORM框架 之 读写分离
- 桌面开发者的界面故事,该醒醒了
- mysql执行shell命令_关键Docker命令:使用Docker必须掌握的公认宝典
- 2019-03-09-算法-进化(买卖股票的最佳时机 II)
- oracle02070,ORA-02070:database does not support semijoin错误 | 信春哥,系统稳,闭眼上线不回滚!...
- JVM笔记(一)数字在JVM中的表示
- ShardingSphere Raw JDBC 主从示例
- 港科大郑光廷院士问诊未来,揭露 AI 最新应用与实践
- 如何修改WSS站点的主菜单
- php qr生成二维码
- oracle卸载界面显示不出来,如果oracle卸载没有正确卸载应该怎么办?
- 密码生成器(C语言实现)
- flex TLF 文本流编辑器
- c语言自动售货机实验报告,c语言自动售货机实验报告(15页)-原创力文档
- 5G路由器智慧灯杆无线联网解决方案
- 《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)
- Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
- 11.26黄金原油最新行情走势分析及多空操作建议实时布局
热门文章
- 数组加链表实现hashMap代码
- 微信小打卡,微信小打卡上打卡方法,被微信推荐的打卡小程序CSS margin(外边距)
- 论文笔记-Reliable Supervision from Transformations for Unsupervised Optical Flow Estimation
- Python 网络爬虫工具:httpx 和 parsel(对比测评)
- 重庆大学计算机学院刘然,重庆大学考研研究生导师简介-刘然
- 微服务框架搭建个人总结(避坑专用)
- 高通骁龙855,麒麟980,A12,Exynos 9820芯片参数比较
- 智能血压计如何测血压计
- 2018年9月24日的中秋之约--期限是2020中秋
- 百度地图,开启marker点拖拽,并监听拖拽后的坐标位置