[关闭]
@2368860385 2018-02-09T06:46:17.000000Z 字数 3786 阅读 226

day1


代码:

  1. struct Matrix {
  2. int a[3][3];
  3. Matrix & operator * (const Matrix & rhs) {
  4. }
  5. }a[MAXN];
  6. struct Node { // [l, r]
  7. Matrix mat;
  8. Node *ls, *rs;
  9. void pushup() {
  10. mat = ls->mat * rs->mat;
  11. }
  12. };
  13. Node *build(int l, int r) {
  14. Node *cur = newNode();
  15. if(l < r) {
  16. int mid = (l + r) / 2;
  17. cur->ls = build(l, mid);
  18. cur->rs = build(mid + 1, r);
  19. cur->pushup();
  20. } else {
  21. cur->mat = a[l];
  22. }
  23. return cur;
  24. }
  25. void modify(Node *cur, int l, int r, int p, Matrix v) {
  26. if(l == r) {
  27. cur->mat = v;
  28. } else {
  29. int mid = (l + r) / 2;
  30. if(p <= mid) modify(cur->ls, l, mid, p, v);
  31. else modify(cur->rs, mid + 1, r, p, v);
  32. cur->pushup();
  33. }
  34. }
  35. void modify(int cur, int l, int r, int p, Matrix v) {
  36. if(l == r) {
  37. st[cur] = v;
  38. } else {
  39. int mid = (l + r) / 2;
  40. if(p <= mid) modify(cur << 1, l, mid, p, v);
  41. else modify(cur << 1 | 1, mid + 1, r, p, v);
  42. pushup(cur);
  43. }
  44. }
  45. Matrix st[MAXN<<2], a[MAXN];
  46. void pushup(int cur) {
  47. st[cur] = st[cur << 1] * st[cur << 1 | 1];
  48. }
  49. void build(int cur, int l, int r) {
  50. if(l < r) {
  51. int mid = (l + r) / 2;
  52. build(cur << 1, l, mid);
  53. build(cur << 1 | 1, mid + 1, r);
  54. pushup(cur);
  55. } else {
  56. st[cur] = a[l];
  57. }
  58. }
  59. bool tag[MAXN<<2];
  60. void pushdown(int cur) {
  61. if(tag[cur]) {
  62. swapRow(st[cur]);
  63. tag[cur << 1] ^= 1;
  64. tag[cur << 1 | 1] ^= 1;
  65. tag[cur] = 0;
  66. }
  67. }
  68. Node *newNode() {
  69. static int cnt = 0;
  70. return &pool[cnt++];
  71. }
  72. int cnt = 0;
  73. Node *newNode() {
  74. return &pool[cnt++];
  75. }
  76. bool lxl_is_hentai[233];
  77. 0000 0000
  78. 0000 0001
  79. bitset<32> lxl_is_hentai;
  80. lxl_is_hentai.count();
  81. unsigned int tmp = 0;
  82. 0000 0000 0000 0000 0000 0000 0000 0000
  83. bool a[233], b[233];
  84. for(int i = 0; i < 233; i++) {
  85. a[i] |= b[i];
  86. }
  87. O(233)
  88. for(int i = 0; i < 256 / 32, i++) {
  89. tmp[i] |= ...;
  90. }
  91. O(n / 32)
  92. struct Node {
  93. bitset<2018> bit;
  94. Node *ls, *rs;
  95. }x;
  96. void set(Node *cur, int v) {
  97. cur->bit.reset();
  98. cur->bit[v] = 1;
  99. }
  100. 3 2
  101. 6 4
  102. 9 3
  103. 11 9
  104. int st[MAXN];
  105. void add(int x) {
  106. st[rank[x]]++;
  107. }
  108. set<int> S;
  109. int find(set<int> & S, int x) { // 第一个大于等于 x 的数
  110. set<int>::iterator it = S.lower_bound(x);
  111. if(it == S.end()) return -1;
  112. return *it;
  113. }
  114. struct OPT {
  115. int type, val, t;
  116. };
  117. vector<OPT> vec[MAXN];
  118. void add(int l, int r, int k) { // [l, r] 加 k
  119. vec[l].push_back(OPT{1, k, curTime});
  120. vec[r + 1].push_back(OPT{1, -k, curTime});
  121. }
  122. void query(int p) { // 查询 p 的历史最大值
  123. vec[p].push_back(OPT{2, -1, curTime});
  124. }
  125. void work() {
  126. for(int i = 1; i <= n; i++) {
  127. for(int j = 0; j < vec[i].size(); j++) {
  128. OPT cur = vec[i][j];
  129. if(cur.type == 1) {
  130. seg.add(1, cur.curTime, cur.k);
  131. }
  132. }
  133. for(int j = 0; j < vec[i].size(); j++) {
  134. OPT cur = vec[i][j];
  135. if(cur.type == 2) {
  136. ans = seg.queryMax(1, cur.curTime);
  137. }
  138. }
  139. }
  140. }
  141. void insert(Node *pre, Node *&cur, int l, int r, int p, int v) {
  142. cur = newNode(); *cur = *pre;
  143. if(l == r) {
  144. cur->val += v;
  145. } else {
  146. int mid = (l + r) / 2;
  147. if(p <= mid) insert(pre->ls, cur->ls, l, mid, p, v);
  148. else insert(pre->rs, cur->rs, mid + 1, r, p, v);
  149. }
  150. }
  151. void init() {
  152. root[0] = build(1, n);
  153. for(int i = 1; i <= n; i++) {
  154. insert(root[i - 1], root[i], 1, n, a[i], 1);
  155. }
  156. }
  157. int query(Node *pre, Node *cur, int l, int r, int k) {
  158. int res;
  159. if(l == r) {
  160. res = l;
  161. } else {
  162. int left = cur->ls->val - pre->ls->val;
  163. int mid = (l + r) / 2;
  164. if(left >= k) {
  165. res = query(pre->ls, cur->ls, l, mid, k);
  166. } else {
  167. res = query(pre->rs, cur->rs, mid + 1, r, k - left);
  168. }
  169. }
  170. return res;
  171. }
  172. int work(int l, int r, int k) {
  173. return query(root[l - 1], root[r], 1, n, k);
  174. }

  1. //luogu P3834
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int MAXN = 200005;
  7. int a[MAXN], b[MAXN], c[MAXN];
  8. struct Node {
  9. int val;
  10. Node *ls, *rs;
  11. Node(): val(0), ls(NULL), rs(NULL) { }
  12. }pool[MAXN*20], *root[MAXN];
  13. Node *newNode() {
  14. static int cnt = 0;
  15. return &pool[cnt++];
  16. }
  17. Node *build(int l, int r) {
  18. Node *cur = newNode();
  19. if(l < r) {
  20. int mid = (l + r) / 2;
  21. cur->ls = build(l, mid);
  22. cur->rs = build(mid + 1, r);
  23. }
  24. return cur;
  25. }
  26. void insert(Node *pre, Node *&cur, int l, int r, int p) {
  27. cur = newNode(); *cur = *pre; cur->val++;
  28. if(l < r) {
  29. int mid = (l + r) / 2;
  30. if(p <= mid) insert(pre->ls, cur->ls, l, mid, p);
  31. else insert(pre->rs, cur->rs, mid + 1, r, p);
  32. }
  33. }
  34. int query(Node *rt1, Node *rt2, int l, int r, int k) {
  35. int res = -1;
  36. if(l == r) {
  37. res = c[l];
  38. } else {
  39. int mid = (l + r) / 2;
  40. int left = rt2->ls->val - rt1->ls->val;
  41. if(left >= k) {
  42. res = query(rt1->ls, rt2->ls, l, mid, k);
  43. } else {
  44. res = query(rt1->rs, rt2->rs, mid + 1, r, k - left);
  45. }
  46. }
  47. return res;
  48. }
  49. int main() {
  50. int n, m;
  51. scanf("%d %d", &n, &m);
  52. for(int i = 1; i <= n; i++) {
  53. scanf("%d", &a[i]);
  54. b[i] = a[i];
  55. }
  56. sort(b + 1, b + n + 1);
  57. int tot = unique(b + 1, b + n + 1) - b - 1;
  58. for(int i = 1; i <= n; i++) {
  59. int p = lower_bound(b + 1, b + tot + 1, a[i]) - b;
  60. c[p] = a[i], a[i] = p;
  61. }
  62. root[0] = build(1, tot);
  63. for(int i = 1; i <= n; i++) {
  64. insert(root[i - 1], root[i], 1, tot, a[i]);
  65. }
  66. while(m--) {
  67. int l, r, k;
  68. scanf("%d %d %d", &l, &r, &k);
  69. printf("%d\n", query(root[l - 1], root[r], 1, tot, k));
  70. }
  71. return 0;
  72. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注