http://acm.hdu.edu.cn/showproblem.php?pid=5283

今天的互测题,又爆零了qwq

考虑每个点对答案的贡献。

对每个点能产生贡献的时间线上的左右端点整体二分。

最后扫一遍即可,\(O(n\log^2n)\)。

拍了好长时间,结果暴力标算都写错了,我不滚粗谁滚粗?

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. const int N = 100003;
  7. struct node {int op, l, r, d;} Q[N];
  8. struct data {int x, y, lx, rx, ly, ry;} P[N];
  9. int n, x1, y1, x2, y2, m, bits[N];
  10. struct gagaga {int id, rest, ans;} B[N], A[N];
  11. void add(int x, int num) {
  12. for (; x <= n; x += (x & (-x)))
  13. bits[x] += num;
  14. }
  15. int query(int x) {
  16. int ret = 0; if (x < 0) return 0;
  17. for (; x; x -= (x & (-x)))
  18. ret += bits[x];
  19. return ret;
  20. }
  21. void solve(int l, int r, int L, int R, int flag) {
  22. if (L > R) return;
  23. if (l == r) {
  24. for (int i = L; i <= R; ++i)
  25. B[i].ans = l;
  26. return;
  27. }
  28. int mid = (l + r) >> 1;
  29. for (int i = l; i <= mid; ++i)
  30. if (Q[i].op == flag) {
  31. add(Q[i].l, Q[i].d);
  32. add(Q[i].r + 1, -Q[i].d);
  33. }
  34. int tmp1 = L, tmp2 = R, t;
  35. for (int i = L; i <= R; ++i)
  36. if ((t = query(B[i].id)) >= B[i].rest)
  37. A[tmp1++] = B[i];
  38. else {
  39. B[i].rest -= t;
  40. A[tmp2--] = B[i];
  41. }
  42. for (int i = L; i <= R; ++i) B[i] = A[i];
  43. for (int i = l; i <= mid; ++i)
  44. if (Q[i].op == flag) {
  45. add(Q[i].l, -Q[i].d);
  46. add(Q[i].r + 1, Q[i].d);
  47. }
  48. solve(l, mid, L, tmp2, flag);
  49. solve(mid + 1, r, tmp1, R, flag);
  50. }
  51. void add_m(int x, int num) {
  52. for (; x <= m + 1; x += (x & (-x)))
  53. bits[x] += num;
  54. }
  55. struct hahaha {
  56. int type, l, r, pos, delta;
  57. bool operator < (const hahaha &A) const {
  58. return pos == A.pos ? type < A.type : pos < A.pos;
  59. }
  60. } H[N << 2];
  61. int main() {
  62. int T; scanf("%d", &T);
  63. while (T--) {
  64. scanf("%d%d%d%d%d", &n, &x1, &y1, &x2, &y2);
  65. for (int i = 1; i <= n; ++i) scanf("%d%d", &P[i].x, &P[i].y);
  66. scanf("%d", &m);
  67. for (int i = 1; i <= m; ++i) {
  68. scanf("%d%d%d", &Q[i].op, &Q[i].l, &Q[i].r);
  69. if (Q[i].op != 3) scanf("%d", &Q[i].d);
  70. }
  71. for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, x1 - P[i].x, 0};
  72. solve(1, m + 1, 1, n, 1);
  73. for (int i = 1; i <= n; ++i) P[B[i].id].lx = B[i].ans;
  74. for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, x2 + 1 - P[i].x, m + 1};
  75. solve(1, m + 1, 1, n, 1);
  76. for (int i = 1; i <= n; ++i) P[B[i].id].rx = B[i].ans;
  77. for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, y1 - P[i].y, 0};
  78. solve(1, m + 1, 1, n, 2);
  79. for (int i = 1; i <= n; ++i) P[B[i].id].ly = B[i].ans;
  80. for (int i = 1; i <= n; ++i) B[i] = (gagaga) {i, y2 + 1 - P[i].y, m + 1};
  81. solve(1, m + 1, 1, n, 2);
  82. for (int i = 1; i <= n; ++i) P[B[i].id].ry = B[i].ans;
  83. int cnt = 0;
  84. for (int i = 1; i <= n; ++i) {
  85. P[i].lx = max(P[i].lx, P[i].ly);
  86. P[i].rx = min(P[i].rx, P[i].ry);
  87. if (P[i].lx >= P[i].rx) continue;
  88. H[++cnt] = (hahaha) {1, i, 0, P[i].lx, 1};
  89. H[++cnt] = (hahaha) {1, i, 0, P[i].rx, -1};
  90. }
  91. for (int i = 1; i <= m; ++i)
  92. if (Q[i].op == 3)
  93. H[++cnt] = (hahaha) {2, Q[i].l, Q[i].r, i, 0};
  94. stable_sort(H + 1, H + cnt + 1);
  95. for (int i = 1; i <= cnt; ++i)
  96. if (H[i].type == 1) add(H[i].l, H[i].delta);
  97. else printf("%d\n", query(H[i].r) - query(H[i].l - 1));
  98. }
  99. return 0;
  100. }

【HDU 5283】Senior's Fish的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  2. 微信小程序滑动选择器

    实现微信小程序滑动选择效果 在wxml文件中,用一个picker标签代表选择器,bindchange是用户点击确定后触发的函数,index是picker自带的参数,用户点击确定后,bindchange ...

  3. 详解JS中Number()、parseInt()和parseFloat()的区别

    三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt().parseFloat(): 专门用于把字符串转换成数值: 一.Number( ): (1)如果是Boolean ...

  4. 【CSS】凹槽的写法

    效果图: 实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  5. 火狐浏览器下点击a标签时出现虚线的解决方案

    1.兼容性问题 火狐浏览器下点击a标签时出现虚线 2.解决方案 a:focus { outline: none;}

  6. Fiddler-- 安装HTTPs证书

    1. 现在很多带有比较重要信息的接口都使用了安全性更高的HTTPS,而Fiddler默认是抓取HTTP类型的接口,要想查看HTTPS类型接口就需要安装fiddler证书.   2.打开Fiddler, ...

  7. Python标准库笔记(4) — collections模块

    这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...

  8. Linux NAPI/非NAPI

    本文主要介绍二层收包流程,包括NAPI与非NAPI方式: NAPI:数据包到来,第一个数据包产生硬件中断,中断处理程序将设备的napi_struct结构挂在当前cpu的待收包设备链表softnet_d ...

  9. CentOS在ssh下远程重装系统

    CentOS在ssh下远程重装系统 http://www.zxsdw.com/index.php/archives/913/ 国外VPS服务器一般都有控制面板,有很多种系统可自行安装,但国内有些IDC ...

  10. Kotlin 学习使用之旅(二)

    为什么从二开始呢?再此之前已经有了一篇了,那是刚知道kotlin的时候草(chao)来(chao)的并且学习一篇, 这次是自己在项目中正式使用并且遇到的一些问题记录,供kotlin新入门的童鞋参考,避 ...