题目链接

洛谷P3759

题解

树状数组套主席树板题

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. #define lbt(x) (x & -x)
  14. using namespace std;
  15. const int maxn = 100005,maxm = 10000005,INF = 1000000000,P = 1000000007;
  16. inline int read(){
  17. int out = 0,flag = 1; char c = getchar();
  18. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  19. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  20. return out * flag;
  21. }
  22. int sum[maxm],siz[maxm],ls[maxm],rs[maxm],cnt;
  23. void upd(int u){
  24. sum[u] = (sum[ls[u]] + sum[rs[u]]) % P;
  25. siz[u] = siz[ls[u]] + siz[rs[u]];
  26. }
  27. void Modify(int& u,int l,int r,int pos,int v,int vv){
  28. if (!u) u = ++cnt;
  29. if (l == r){sum[u] += v; siz[u] += vv; return;}
  30. int mid = l + r >> 1;
  31. if (mid >= pos) Modify(ls[u],l,mid,pos,v,vv);
  32. else Modify(rs[u],mid + 1,r,pos,v,vv);
  33. upd(u);
  34. }
  35. cp Query(int u,int l,int r,int L,int R){
  36. if (!u) return mp(0,0);
  37. if (l >= L && r <= R) return mp(sum[u],siz[u]);
  38. int mid = l + r >> 1;
  39. if (mid >= R) return Query(ls[u],l,mid,L,R);
  40. if (mid < L) return Query(rs[u],mid + 1,r,L,R);
  41. cp t = Query(ls[u],l,mid,L,R),tt = Query(rs[u],mid + 1,r,L,R);
  42. return mp((t.first + tt.first) % P,t.second + tt.second);
  43. }
  44. int rt[maxn << 2],n,m,N = 100005,A[maxn],V[maxn]; LL ans;
  45. void modify(int u,int pos,int v,int vv){
  46. for (int i = u; i <= N; i += lbt(i))
  47. Modify(rt[i],1,N,pos,v,vv);
  48. }
  49. cp query(int l,int r,int L,int R){
  50. if (L > R) return mp(0,0);
  51. cp re = mp(0,0),t;
  52. for (int i = r; i; i -= lbt(i)){
  53. t = Query(rt[i],1,N,L,R);
  54. re.first = (re.first + t.first) % P;
  55. re.second += t.second;
  56. }
  57. for (int i = l - 1; i; i -= lbt(i)){
  58. t = Query(rt[i],1,N,L,R);
  59. re.first = (re.first - t.first + P) % P;
  60. re.second -= t.second;
  61. }
  62. return re;
  63. }
  64. int main(){
  65. n = read(); m = read();
  66. int x,y; cp t,tt;
  67. REP(i,n){
  68. A[i] = read(); V[i] = read();
  69. if (i - 1){
  70. t = query(1,i - 1,A[i] + 1,N);
  71. ans = ((ans + t.first) % P + 1ll * t.second * V[i] % P) % P;
  72. }
  73. modify(i,A[i],V[i],1);
  74. }
  75. while (m--){
  76. x = read(); y = read();
  77. if (x == y){printf("%lld\n",(ans % P + P) % P); continue;}
  78. if (x > y) swap(x,y);
  79. if (A[x] < A[y]) ans = ((ans + V[x]) % P + V[y]) % P;
  80. else ans = ((ans - (V[x] + V[y]) % P) % P + P) % P;
  81. if (x < y){
  82. t = query(x + 1,y - 1,A[x] + 1,N);
  83. tt = query(x + 1,y - 1,1,A[x] - 1);
  84. t.first = (t.first - tt.first) % P; t.second -= tt.second;
  85. ans = ((ans + t.first) % P + 1ll * V[x] * t.second % P) % P;
  86. t = query(x + 1,y - 1,1,A[y] - 1);
  87. tt = query(x + 1,y - 1,A[y] + 1,N);
  88. t.first = ((t.first - tt.first) % P + P) % P; t.second -= tt.second;
  89. ans = ((ans + t.first) % P + 1ll * V[y] * t.second % P) % P;
  90. }
  91. modify(x,A[x],-V[x],-1);
  92. modify(y,A[y],-V[y],-1);
  93. modify(x,A[y],V[y],1);
  94. modify(y,A[x],V[x],1);
  95. swap(A[x],A[y]); swap(V[x],V[y]);
  96. printf("%lld\n",(ans % P + P) % P);
  97. }
  98. return 0;
  99. }

洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】的更多相关文章

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

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

  2. [P3759][TJOI2017]不勤劳的图书管理员(分块+树状数组)

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

  3. LUOGU P3759 [TJOI2017]不勤劳的图书管理员(树套树)

    传送门 解题思路 和以前做过的一道题有点像,就是区间逆序对之类的问题,用的是\(BIT\)套权值线段树,交换时讨论一下计算答案..跑的不如暴力快.. 代码 #include<iostream&g ...

  4. P3759 [TJOI2017]不勤劳的图书管理员 [树套树]

    树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...

  5. luogu3759 不勤劳的图书管理员 (树状数组套线段树)

    交换的话,只有它们中间的书会对答案产生影响 树状数组记位置,套线段树记书的编号 它对应的页数和书的个数 然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上 别忘了考虑这两个自己交换以后是不 ...

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

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

  7. [TJOI2017] 不勤劳的图书管理员

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

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

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

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

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

随机推荐

  1. 「赛后补题」Meeting(HDU-5521)

    题意 A,B两个人分别在1和n区.每个区有若干点(区之间的点可以重复,各个区内点间的距离一致),给出区之间有联系的图以及到达所需时间.求两个人见面最短时间以及在哪个区碰面(可有多个) 分析 隐式图搜索 ...

  2. C#冒泡排序法及优化

    冒泡排序法及优化: static void Main(string[] args) { , , , , , }; ; //冒泡排序法 ; i < sums.Length - ; i++) //总 ...

  3. lintcode 二叉树中序遍历

    /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * Tr ...

  4. 天平 (Not so Mobile UVA - 839)

    题目描述: 题目思路: 1.DFS建树 2.只有每个树的左右子树都平衡整颗树才平衡 #include <iostream> using namespace std; bool solve( ...

  5. 正则表达式 和 re 模块

    正则表达式究竟是什么? 在一些网站注册的时候需要输入手机号码,当你输入一个错误的手机号码的时候,会提示你输入的手机号码格式错误 那么他究竟是如何判断的呢? 我们用Python代码进行表示: phone ...

  6. Python3 数据类型-元组

    Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 实例1(Python3.0+): tu ...

  7. 阿里云搭建bind服务,外网ip不能用来解析问题解决

    options { listen-on port 53 { any; }; //端口开放any listen-on-v6 port 53 { ::1; }; directory "/var/ ...

  8. str和repr

    在Python2.6和Python3.0以及更早的版本中,在交互式模式下的输出本质上是使用repr,因此对于一些浮点数运算,会显示很多位: 4 / 5.0 #0.8000000000000004 但是 ...

  9. c# dll问题

    问题描述: dll完全拷贝另一个程序,可是报缺少引用程序集之类的错误. 解决办法: 有可能是.net版本造成的错误.一般常见在3.5升到4之后,存在很多容差.

  10. mysql唯一查询

    MySQL单一字段唯一其他字段差异性忽略查询.在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返 ...