比赛 cdcqの省选膜你赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 新史「新幻想史 -现代史-」 最终得分 100
用户昵称 LoveYayoi 运行时间 6.318 s
代码语言 C++ 内存使用 12.14 MiB
提交时间 2017-04-11 20:15:06
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <string>
  6. #include <cstring>
  7. #include <cmath>
  8. #include <map>
  9. #include <stack>
  10. #include <set>
  11. #include <vector>
  12. #include <queue>
  13. #include <time.h>
  14. #define eps 10e-7
  15. #define INF 0x3f3f3f3f
  16. #define MOD 1000000007
  17. #define rep0(j,n) for(int j=0;j<n;++j)
  18. #define rep1(j,n) for(int j=1;j<=n;++j)
  19. #define pb push_back
  20. #define set0(n) memset(n,0,sizeof(n))
  21. #define ll long long
  22. //#define OJ
  23. using namespace std;
  24. int read() {
  25. char c = getchar(); int f = 1, x = 0;
  26. while (!isdigit(c)) { if (c == '-') f = -1; c = getchar(); }
  27. while (isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); }
  28. return f*x;
  29. }
  30. char get_ch() {
  31. char c = getchar();
  32. while (!isalpha(c)) c = getchar();
  33. return c;
  34. }
  35. const int MAXINT = 50010;
  36. ll ans[MAXINT];
  37. int n, m, cnt = 0, cnt_q = 0;
  38. struct node {
  39. int lb, rb;
  40. ll sum, tag;
  41. node *c[2];
  42. node(int _lb, int _rb) :lb(_lb), rb(_rb),tag(0),sum(0) {}
  43. node() :tag(0), sum(0) {
  44. }
  45. int check(int l, int r) {
  46. if (l <= lb&&r >= rb) return 1;
  47. if (l >= rb || r <= lb) return 0;
  48. return -1;
  49. }
  50. void add_tag(ll v) {
  51. sum += v*(rb - lb);
  52. tag += v;
  53. }
  54. void pushdown() {
  55. c[0]->add_tag(tag);
  56. c[1]->add_tag(tag);
  57. tag = 0;
  58. }
  59. void pushup() {
  60. sum = c[0]->sum + c[1]->sum;
  61. }
  62. };
  63. struct seg_tree {
  64. node mp[MAXINT * 4];
  65. int cnt;
  66. node *rt;
  67. seg_tree() {
  68. cnt = 0;
  69. }
  70. node* new_node(int l, int r) {
  71. mp[cnt] = node(l, r);
  72. return &mp[cnt++];
  73. }
  74. void make_tree(int l, int r) {
  75. rt = new_node(l, r);
  76. _make_tree(rt, l, r);
  77. }
  78. void _make_tree(node *p, int l, int r) {
  79. if (r - l == 1) {
  80. p->sum = 0;
  81. return;
  82. }
  83. p->c[0] = new_node(l, (l + r) / 2);
  84. p->c[1] = new_node((l + r) / 2, r);
  85. _make_tree(p->c[0], l, (l + r) / 2);
  86. _make_tree(p->c[1], (l + r) / 2, r);
  87. p->pushup();
  88. }
  89. ll seg_query(int l, int r) {
  90. return _seg_query(rt, l, r);
  91. }
  92. ll _seg_query(node *p, int l, int r) {
  93. int tp = p->check(l, r);
  94. if (tp == 1) return p->sum;
  95. if (tp == 0) return 0;
  96. p->pushdown();
  97. return _seg_query(p->c[0], l, r) + _seg_query(p->c[1], l, r);
  98. }
  99. void seg_add(int l, int r, int v) {
  100. _seg_add(rt, l, r, v);
  101. }
  102. void _seg_add(node *p, int l, int r, int v) {
  103. int tp = p->check(l, r);
  104. if (tp == 1) { p->add_tag(v); return; }
  105. if (tp == 0) return;
  106. _seg_add(p->c[0], l, r, v); _seg_add(p->c[1], l, r, v);
  107. p->pushdown();
  108. p->pushup();
  109. }
  110. }seg;
  111. struct op {
  112. int tp, t, no, q_no, l, r, v;
  113. op(int _t, int _no, int _l, int _r, int _v) {
  114. tp = 1;
  115. t = _t;
  116. no = _no;
  117. l = _l;
  118. r = _r;
  119. v = _v;
  120. }
  121. op() {}
  122. op(int _t, int _no, int _l, int _r) {
  123. tp = 0;
  124. t = _t;
  125. q_no = cnt_q;
  126. no = _no;
  127. l = _l;
  128. r = _r;
  129. }
  130. }ops[200010];
  131. bool cmpt(const op &a, const op &b) {
  132. return a.t == b.t ? a.tp > b.tp:a.t < b.t;
  133. }
  134. bool cmpno(const op &a, const op &b) {
  135. return a.no == b.no ? a.tp > b.tp : a.no < b.no;
  136. }
  137. void cdq(int l, int r) {
  138. if (r - l == 1) {
  139. return;
  140. }
  141. cdq(l, (l + r) / 2);
  142. cdq((l + r) / 2, r);
  143. sort(ops + l, ops + (l + r) / 2, cmpt);
  144. sort(ops + (l + r) / 2, ops + r, cmpt);
  145. int i = l;
  146. int j = (l + r) / 2;
  147. for (; j < r; j++) {
  148. if (ops[j].tp == 1) continue;
  149. for (; i < (l + r) / 2 && ops[i].t <= ops[j].t; i++) {
  150. if (ops[i].tp == 0) continue;
  151. seg.seg_add(ops[i].l, ops[i].r, ops[i].v);
  152. }
  153. ans[ops[j].q_no] += seg.seg_query(ops[j].l, ops[j].r);
  154. }
  155. i = l;
  156. j = (l + r) / 2;
  157. for (; j < r; j++) {
  158. if (ops[j].tp == 1) continue;
  159. for (; i < (l + r) / 2 && ops[i].t <= ops[j].t; i++) {
  160. if (ops[i].tp == 0) continue;
  161. seg.seg_add(ops[i].l, ops[i].r, -ops[i].v);
  162. }
  163. }
  164. sort(ops + l, ops + r, cmpt);
  165. }
  166. void get_input() {
  167. n = read(); m = read();
  168. seg.make_tree(0, n);
  169. char tp;
  170. int t, l, r, v, l1, r1, v1;
  171. rep0(i, n) {
  172. t = read();
  173. ops[cnt++] = op(-1, -1, i, i + 1, t);
  174. }
  175. rep0(i, m) {
  176. tp = get_ch();
  177. if (tp == 'Q') {
  178. l = read(); r = read(); t = read();
  179. ops[cnt++] = op(t, i, l - 1, r);
  180. cnt_q++;
  181. }
  182. else {
  183. l = read(); r = read(); v = read(); l1 = read(); r1 = read(); v1 = read(); t = read();
  184. ops[cnt++] = op(t, i, l - 1, r, -v);
  185. ops[cnt++] = op(t, i, l1 - 1, r1, v1);
  186. }
  187. }
  188. }
  189. void work() {
  190. cdq(0, cnt);
  191. rep0(i, cnt_q) {
  192. printf("%lld\n", ans[i]);
  193. }
  194. }
  195. int main() {
  196. freopen("cdcq_a.in", "r", stdin);
  197. freopen("cdcq_a.out", "w", stdout);
  198. get_input();
  199. work();
  200. return 0;
  201. }
  202.  
  203.