考虑转化问题模型,这个没必要可持久化,直接加点就可以了,还不用删点

每次的问题是求 曼哈顿距离,变成切比雪夫距离然后求解

然后我们考虑将这玩意旋转 45度, 然后原坐标的 \((x,y)\) 会变成 \((\frac{x{-}y}{\sqrt 2} , \frac{x+y}{\sqrt 2})\)

发现 \(\sqrt 2\) 是可以到最后抵消掉的,就……没了?

暴力树套树就过了啊

随便抓两个图



  1. // powered by c++11
  2. // by Isaunoya
  3. #include <bits/stdc++.h>
  4. #define rep(i, x, y) for (register int i = (x); i <= (y); ++i)
  5. #define Rep(i, x, y) for (register int i = (x); i >= (y); --i)
  6. using namespace std;
  7. using db = double;
  8. using ll = long long;
  9. using uint = unsigned int;
  10. // #define int long long
  11. using pii = pair<int, int>;
  12. #define ve vector
  13. #define Tp template
  14. #define all(v) v.begin(), v.end()
  15. #define sz(v) ((int)v.size())
  16. #define pb emplace_back
  17. #define fir first
  18. #define sec second
  19. // the cmin && cmax
  20. Tp<class T> void cmax(T& x, const T& y) {
  21. if (x < y) x = y;
  22. }
  23. Tp<class T> void cmin(T& x, const T& y) {
  24. if (x > y) x = y;
  25. }
  26. // sort , unique , reverse
  27. Tp<class T> void sort(ve<T>& v) { sort(all(v)); }
  28. Tp<class T> void unique(ve<T>& v) {
  29. sort(all(v));
  30. v.erase(unique(all(v)), v.end());
  31. }
  32. Tp<class T> void reverse(ve<T>& v) { reverse(all(v)); }
  33. const int SZ = 0x191981;
  34. struct FILEIN {
  35. ~FILEIN() {}
  36. char qwq[SZ], *S = qwq, *T = qwq, ch;
  37. char GETC() { return (S == T) && (T = (S = qwq) + fread(qwq, 1, SZ, stdin), S == T) ? EOF : *S++; }
  38. FILEIN& operator>>(char& c) {
  39. while (isspace(c = GETC()))
  40. ;
  41. return *this;
  42. }
  43. FILEIN& operator>>(string& s) {
  44. while (isspace(ch = GETC()))
  45. ;
  46. s = ch;
  47. while (!isspace(ch = GETC())) s += ch;
  48. return *this;
  49. }
  50. Tp<class T> void read(T& x) {
  51. bool sign = 1;
  52. while ((ch = GETC()) < 0x30)
  53. if (ch == 0x2d) sign = 0;
  54. x = (ch ^ 0x30);
  55. while ((ch = GETC()) > 0x2f) x = x * 0xa + (ch ^ 0x30);
  56. x = sign ? x : -x;
  57. }
  58. FILEIN& operator>>(int& x) { return read(x), *this; }
  59. // FILEIN& operator>>(signed& x) { return read(x), *this; }
  60. FILEIN& operator>>(unsigned& x) { return read(x), *this; }
  61. } in;
  62. struct FILEOUT {
  63. const static int LIMIT = 0x114514;
  64. char quq[SZ], ST[0x114];
  65. signed sz, O;
  66. ~FILEOUT() { sz = O = 0; }
  67. void flush() {
  68. fwrite(quq, 1, O, stdout);
  69. fflush(stdout);
  70. O = 0;
  71. }
  72. FILEOUT& operator<<(char c) { return quq[O++] = c, *this; }
  73. FILEOUT& operator<<(string str) {
  74. if (O > LIMIT) flush();
  75. for (char c : str) quq[O++] = c;
  76. return *this;
  77. }
  78. Tp<class T> void write(T x) {
  79. if (O > LIMIT) flush();
  80. if (x < 0) {
  81. quq[O++] = 0x2d;
  82. x = -x;
  83. }
  84. do {
  85. ST[++sz] = x % 0xa ^ 0x30;
  86. x /= 0xa;
  87. } while (x);
  88. while (sz) quq[O++] = ST[sz--];
  89. return;
  90. }
  91. FILEOUT& operator<<(int x) { return write(x), *this; }
  92. // FILEOUT& operator<<(signed x) { return write(x), *this; }
  93. FILEOUT& operator<<(unsigned x) { return write(x), *this; }
  94. } out;
  95. int n, q;
  96. const int maxn = 6e4 + 46;
  97. int a[maxn];
  98. const int maxm = 2e6 + 62;
  99. const int maxp = 2e7 + 72;
  100. int rt[maxm], ls[maxp], rs[maxp], sum[maxp];
  101. int cnt = 0;
  102. void upd(int& p, int l, int r, int x) {
  103. if (!p) p = ++cnt;
  104. sum[p]++;
  105. if (l == r) return;
  106. int mid = l + r >> 1;
  107. if (x <= mid)
  108. upd(ls[p], l, mid, x);
  109. else
  110. upd(rs[p], mid + 1, r, x);
  111. }
  112. int ql, qr;
  113. int qry(int p, int l, int r) {
  114. if (!p) return 0;
  115. if (ql <= l && r <= qr) return sum[p];
  116. int mid = l + r >> 1, ans = 0;
  117. if (ql <= mid) ans = qry(ls[p], l, mid);
  118. if (qr > mid) ans += qry(rs[p], mid + 1, r);
  119. return ans;
  120. }
  121. const int up = 300000;
  122. const int lim = 600000;
  123. int low(int x) { return x & -x; }
  124. void add(int x, int y) {
  125. for (; x <= lim; x += low(x)) upd(rt[x], 1, lim, y);
  126. }
  127. int qry(int x) {
  128. int ans = 0;
  129. for (; x; x ^= low(x)) ans += qry(rt[x], 1, lim);
  130. return ans;
  131. }
  132. signed main() {
  133. #ifdef _WIN64
  134. freopen("testdata.in", "r", stdin);
  135. #endif
  136. // code begin.
  137. in >> n >> q;
  138. rep(i, 1, n) { in >> a[i], add(i - a[i] + up, i + a[i] + up); }
  139. rep(i, 1, q) {
  140. string s;
  141. int x, y;
  142. in >> s >> x >> y;
  143. if (s == "Modify")
  144. add(x - y + up, x + y + up), a[x] = y;
  145. else {
  146. ql = x + a[x] - y + up;
  147. qr = x + a[x] + y + up;
  148. out << qry(x - a[x] + y + up) - qry(x - a[x] - y + up - 1) << '\n';
  149. }
  150. }
  151. return out.flush(), 0;
  152. // code end.
  153. }

BZOJ #2989. 数列 [树套树]的更多相关文章

  1. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  2. [BZOJ 3489] A simple rmq problem 【可持久化树套树】

    题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...

  3. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  4. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  5. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  6. BZOJ 3110 树套树 && 永久化标记

    感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...

  7. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

  8. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  9. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

随机推荐

  1. FFMPEG学习----分离视频里的H.264与YUV数据

    #include <stdio.h> extern "C" { #include "libavcodec/avcodec.h" #include & ...

  2. Java实现多线程下载,支持断点续传

    完整代码:https://github.com/iyuanyb/Downloader 多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内 ...

  3. HDU2066dijkstra模板题

    问题描述: 题目描述:Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中    会遇见很多人(白马王 ...

  4. new 的实现原理

    自己封装一个new <script> // 创建一个构造函数 function Father() { this.name = '小红'; this.eat = function () { ...

  5. 数据算法 --hadoop/spark数据处理技巧 --(17.小文件问题 18.MapReuce的大容量缓存)

    十七.小文件问题 十八.MR的大容量缓存 在MR中使用和读取大容量缓存,(也就是说,可能包括数十亿键值对,而无法放在一个商用服务器的内存中).本次提出的算法通用,可以在任何MR范式中使用.(eg:MR ...

  6. centos7 nginx 启动脚本

    [root@localhost ~]# vim /lib/systemd/system/nginx.service [Unit] Description=nginx After=network.tar ...

  7. shell脚本 监控ps 不存在则重启

    监控 tomcat ,如果自动停止了,则重新启动 #!/bin/bash Start=/usr/local/apache-tomcat-8.0.24/bin/startup.sh Url=" ...

  8. centos7.5下yum安装mysql-5.6.43

    cd ~/ && cat /etc/redhat-release yum list installed |grep mysql #<===查看是否安装mysql,如果已经安装,使 ...

  9. Ubuntu14.04安装及配置mysql5.7.19

    通过uname -a或lsb_release -a 查看版本信息 ,确定linux的发行版是debian还是ubuntu.root@suepc:/usr/local# uname -aLinux su ...

  10. java的异常体系 及强制转换

    一,异常 1.常见的几种异常: StackOverFlow  栈溢出错误:写递归函数的时候,没有定义递归结束的条件. ArrayIndexOutofBounds   数组越界:如新new一个数组,in ...