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]不勤劳的图书管理员相关推荐

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

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

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

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

  3. [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组

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

  4. 周末狂欢赛2(冒泡排序,概率充电器,不勤劳的图书管理员)

    狂欢2 T1:冒泡排序 题目 题解 CODE T2:概率充电器 题目 题解 CODE T3:不勤劳的图书管理员 题目 题解 CODE 我不这么认为.... T1:冒泡排序 题目 下面是一段实现冒泡排序 ...

  5. springboot图书管理怎么实现借书时间到期提醒_智能机器人充当图书管理员,看看它能干嘛...

    想必大家都去过图书馆吧,每当出现一些问题时,大家都会询问图书管理员.说起图书管理员的工作,大多数人的印象是强度大.单调且单一.重复性强.效率低.如果智能机器人走进图书馆,当起了图书管理员了,现状将完全 ...

  6. 图书管理员【2017年普及组第二题】

    图书管理员图书管理员图书管理员 题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图书编 ...

  7. my-medium.cnf_您的手机如何打开medium.com-我将让门卫和图书管理员解释。

    my-medium.cnf by Andrea Zanin 由Andrea Zanin 您的手机如何打开medium.com-我将让门卫和图书管理员解释. (How your phone opens ...

  8. 牛客题库 题解 | #[NOIP2017]图书管理员#

    链接:#[NOIP2017]图书管理员# 题目牛客网是互联网求职神器,C++.Java.前端.产品.运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨 ...

  9. P3955 [NOIP2017 普及组] 图书管理员C++题解

    洛谷来源:P3955 [NOIP2017 普及组] 图书管理员 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/sol ...

最新文章

  1. jpg怎么合成一份_哪些超实用的有机化学知识点---之有机合成工具包
  2. 成长轨迹59 【ACM算法之路 百炼poj.grids.cn】【递归】【2694:逆波兰表达式】
  3. AntData.ORM框架 之 读写分离
  4. 桌面开发者的界面故事,该醒醒了
  5. mysql执行shell命令_关键Docker命令:使用Docker必须掌握的公认宝典
  6. 2019-03-09-算法-进化(买卖股票的最佳时机 II)
  7. oracle02070,ORA-02070:database does not support semijoin错误 | 信春哥,系统稳,闭眼上线不回滚!...
  8. JVM笔记(一)数字在JVM中的表示
  9. ShardingSphere Raw JDBC 主从示例
  10. 港科大郑光廷院士问诊未来,揭露 AI 最新应用与实践
  11. 如何修改WSS站点的主菜单
  12. php qr生成二维码
  13. oracle卸载界面显示不出来,如果oracle卸载没有正确卸载应该怎么办?
  14. 密码生成器(C语言实现)
  15. flex TLF 文本流编辑器
  16. c语言自动售货机实验报告,c语言自动售货机实验报告(15页)-原创力文档
  17. 5G路由器智慧灯杆无线联网解决方案
  18. 《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)
  19. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
  20. 11.26黄金原油最新行情走势分析及多空操作建议实时布局

热门文章

  1. 数组加链表实现hashMap代码
  2. 微信小打卡,微信小打卡上打卡方法,被微信推荐的打卡小程序CSS margin(外边距)
  3. 论文笔记-Reliable Supervision from Transformations for Unsupervised Optical Flow Estimation
  4. Python 网络爬虫工具:httpx 和 parsel(对比测评)
  5. 重庆大学计算机学院刘然,重庆大学考研研究生导师简介-刘然
  6. 微服务框架搭建个人总结(避坑专用)
  7. 高通骁龙855,麒麟980,A12,Exynos 9820芯片参数比较
  8. 智能血压计如何测血压计
  9. 2018年9月24日的中秋之约--期限是2020中秋
  10. 百度地图,开启marker点拖拽,并监听拖拽后的坐标位置