【题目链接】:http://hihocoder.com/problemset/problem/1488

【题意】



中文题

【题解】



莫队算法+树状数组;

首先贪心地知道,应该按照时间从小到大的顺序打水;

可以发现;

新增加一个人打水的话,对时间小于它的人打水没有影响;

只对时间大于它的人打水的时间有影响;

具体的;

对于时间大于它的打水的人的个数*这个人打水的时间;是新增加的打水时间;

然后同时还要加上这个人单独打水的时间;

即在它前面(时间比它小的打水的人)的所有打水时间总和+这个人的打水时间就是这个人的单独打水时间;

同样的道理

减去一个人也只会对它后面的人造成影响;

前面的人不受影响;

再减去它自身就可以了;

既然能够知道减少一个或者多一个人对答案的影响了;

则直接用莫队算法搞就好了



【Number Of WA】



0



【完整代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define ms(x,y) memset(x,y,sizeof x)
  13. typedef pair<int,int> pii;
  14. typedef pair<LL,LL> pll;
  15. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  16. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  17. const double pi = acos(-1.0);
  18. const int N = 2e4+100;
  19. struct abc
  20. {
  21. int l,r,id;
  22. };
  23. int n,m,a[N],l,r,num;
  24. LL bit[N],bit2[N],ans,out[N];
  25. abc b[N];
  26. int lowbit(int x)
  27. {
  28. return x&(-x);
  29. }
  30. bool cmp(abc a,abc b)
  31. {
  32. if (a.l/100==b.l/100)
  33. return a.r < b.r;
  34. else
  35. return a.l < b.l;
  36. }
  37. void add(int x,int key)
  38. {
  39. if (key==1)
  40. {
  41. int y = x-1;
  42. LL sum = 0,cnt = 0;
  43. while (y>0)
  44. {
  45. sum+=bit[y];
  46. cnt+=bit2[y];
  47. y-=lowbit(y);
  48. }
  49. ans+=sum+x+(num-cnt)*x;
  50. y = x;
  51. while (y<N-10)
  52. {
  53. bit[y]+=x;
  54. bit2[y]++;
  55. y+=lowbit(y);
  56. }
  57. num++;
  58. }
  59. else
  60. {
  61. int y = x-1;
  62. LL sum = 0,cnt = 0;
  63. while (y>0)
  64. {
  65. sum+=bit[y];
  66. cnt+=bit2[y];
  67. y-=lowbit(y);
  68. }
  69. ans-=sum+x+(num-cnt-1)*x;
  70. y = x;
  71. while (y<N-10)
  72. {
  73. bit[y]-=x;
  74. bit2[y]--;
  75. y+=lowbit(y);
  76. }
  77. num--;
  78. }
  79. }
  80. int main()
  81. {
  82. //freopen("F:\\rush.txt","r",stdin);
  83. ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
  84. int T;
  85. cin >> T;
  86. while (T--)
  87. {
  88. rep1(i,0,N-10)
  89. bit[i] = bit2[i] = 0;
  90. cin >> n >> m;
  91. rep1(i,1,n) cin >> a[i];
  92. rep1(i,1,m)
  93. {
  94. cin >> b[i].l >> b[i].r;
  95. b[i].id = i;
  96. }
  97. sort(b+1,b+1+m,cmp);
  98. l = 1,r = 1,ans = 0,num = 0;
  99. add(a[l],1);
  100. rep1(i,1,m)
  101. {
  102. while (r<b[i].r) add(a[++r],1);
  103. while (l>b[i].l) add(a[--l],1);
  104. while (r>b[i].r) add(a[r--],-1);
  105. while (l<b[i].l) add(a[l++],-1);
  106. out[b[i].id] = ans;
  107. }
  108. rep1(i,1,m) cout << out[i] << endl;
  109. }
  110. return 0;
  111. }

【[Offer收割]编程练习赛11 D】排队接水的更多相关文章

  1. hihocoder offer收割编程练习赛11 D 排队接水

    思路: 莫队算法+树状数组. 莫队算法的基本思想是对大量要查询的区间进行离线处理,按照一定的顺序计算,来降低复杂度.概括来说,我们在知道了[l, r]的解,并且可以通过一个较低的复杂度推出[l - 1 ...

  2. hihocoder offer收割编程练习赛11 C 岛屿3

    思路: 并查集的应用. 实现: #include <iostream> #include <cstdio> using namespace std; ][]; int n, x ...

  3. hihocoder offer收割编程练习赛11 B 物品价值

    思路: 状态压缩 + dp. 实现: #include <iostream> #include <cstdio> #include <cstring> #inclu ...

  4. hihocoder offer收割编程练习赛11 A hiho字符串

    思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: #include <iostream> #include <cstdio> #includ ...

  5. 【[Offer收割]编程练习赛11 B】物品价值

    [题目链接]:http://hihocoder.com/problemset/problem/1486 [题意] [题解] 设f[i][j]表示前i个物品,每种属性的状态奇偶状态为j的最大价值; 这里 ...

  6. 【[Offer收割]编程练习赛11 C】岛屿3

    [题目链接]:http://hihocoder.com/problemset/problem/1487 [题意] 中文题 [题解] 岛屿的数目对应了这个图中联通块的数目; 面积则对应有多少个方块; 周 ...

  7. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  8. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  9. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

随机推荐

  1. Android内存解析(二)— 详解内存,内部存储和外部存储

    总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...

  2. clone的rails目录下命令无效问题

    异常坑爹,在公司克隆自己的项目.然后在项目目录下rails s还有一大堆命令无效,提示 Usage: rails new APP_PATH [options]   找了半天总算找到解决办法了,在项目目 ...

  3. HDU2186

    2019-05-30 19:31:10 水题 #include <bits/stdc++.h> using namespace std; int main() { int c; scanf ...

  4. C - Arrival of the General

    Problem description A Ministry for Defense sent a general to inspect the Super Secret Military Squad ...

  5. 我的MYSQL学习心得(推荐)

    http://www.cnblogs.com/lyhabc/category/573945.html

  6. VS2015 右侧导航插件地址

    右侧导航插件: https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.ProductivityPowe ...

  7. 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

  8. RPC与REST

    RPC与REST (摘自网络,个人理解)

  9. centos下使用shell+expect远程登录主机

    # 安装expect yum install expect # 新建脚本文件running #!/usr/bin/expect spawn /usr/bin/ssh root@114.114.114. ...

  10. CentOS 安装dotNetCore

    如果要在CentOS上运行.net Core程序,必须安装.net Core Sdk 具体安装 方法,可以参考微软官方站点说明,非常详细: 1)百度搜索 .Net Core 2)先择CentOS版本: ...