[关闭]
@ZCDHJ 2019-10-09T11:35:20.000000Z 字数 1232 阅读 555

HEOI2012 采花

未分类


要计算在一个区间内出现两次以上的数的个数,可以看成每种颜色只有第二个出现的才有贡献,那么将查询离线按 排序,然后树状数组维护。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. const int MAXN = 3e6;
  6. int n, m;
  7. int a[MAXN | 1], nxt[MAXN | 1], col[MAXN | 1];
  8. int bit[MAXN | 1], ans[MAXN | 1];
  9. struct Query {
  10. int l, r, id;
  11. Query() : l(0), r(0), id(0) {}
  12. friend bool operator< (const Query &lhs, const Query &rhs) {
  13. return lhs.l < rhs.l;
  14. }
  15. } que[MAXN | 1];
  16. inline int read() {
  17. register int x = 0;
  18. register char ch = getchar();
  19. while (!isdigit(ch)) ch = getchar();
  20. while (isdigit(ch)) {
  21. x = x * 10 + ch - '0';
  22. ch = getchar();
  23. }
  24. return x;
  25. }
  26. int query(int x) {
  27. int res = 0;
  28. while (x > 0) {
  29. res += bit[x];
  30. x -= x & (-x);
  31. }
  32. return res;
  33. }
  34. void modify(int x, int y) {
  35. while (x <= n) {
  36. bit[x] += y;
  37. x += x & (-x);
  38. }
  39. }
  40. int main() {
  41. freopen("code.in", "r", stdin);
  42. freopen("code.out", "w", stdout);
  43. n = read();
  44. read();
  45. m = read();
  46. for (int i = 1; i <= n; ++i) a[i] = read();
  47. for (int i = n; i >= 1; --i) {
  48. nxt[i] = col[a[i]];
  49. col[a[i]] = i;
  50. }
  51. for (int i = 1; i <= m; ++i) {
  52. que[i].l = read();
  53. que[i].r = read();
  54. que[i].id = i;
  55. }
  56. std::sort(que + 1, que + 1 + m);
  57. memset(col, 0, sizeof(col));
  58. for (int i = 1; i <= n; ++i) {
  59. if (++col[a[i]] == 2) modify(i, 1);
  60. }
  61. for (int i = 1; i <= m; ++i) {
  62. if (que[i].l != que[i - 1].l) {
  63. for (int j = que[i - 1].l; j < que[i].l; ++j) {
  64. if (nxt[j]) modify(nxt[j], -1);
  65. if (nxt[nxt[j]]) {
  66. modify(nxt[nxt[j]], 1);
  67. }
  68. }
  69. }
  70. ans[que[i].id] = query(que[i].r) - query(que[i].l - 1);
  71. }
  72. for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
  73. return 0;
  74. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注