记录编号 421181 评测结果 AAAAAAAAAA
题目名称 [NOI 2007]项链工厂 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 1.511 s
提交时间 2017-07-06 11:39:02 内存使用 30.81 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #define file "necklace."
  5. #define mid ((l+r)>>1)
  6. #define lch (o<<1)
  7. #define rch (o<<1|1)
  8. const int N = 5e5 + 10, V = N << 2;
  9. int n, q, c, co[V], s, r = 1;
  10. struct Node {int c[2], s;
  11. Node operator+(const Node& rhs)const {
  12. Node x = *this;
  13. x.c[1] = rhs.c[1];
  14. x.s += rhs.s - (this->c[1] == rhs.c[0]);
  15. return x;
  16. }
  17. }st[V];
  18. char cmd[10];
  19. inline void mkco(int o, int x) {
  20. if (!o) return;
  21. co[o] = x;
  22. st[o].c[0] = st[o].c[1] = x;
  23. st[o].s = 1;
  24. }
  25. inline void up(int o) {st[o] = st[lch] + st[rch];}
  26. inline void down(int o) {
  27. if (co[o] <= c) mkco(lch, co[o]), mkco(rch, co[o]), co[o] = c+ 1;
  28. }
  29. void build(int o, int l, int r) {
  30. co[o] = c + 1;
  31. if (l == r) {
  32. int x;
  33. scanf("%d", &x);
  34. st[o].c[0] = st[o].c[1] = x;
  35. st[o].s = 1;
  36. return;
  37. }
  38. build(lch, l, mid);
  39. build(rch, mid+1, r);
  40. up(o);
  41. }
  42. Node query(int o, int l, int r, int q1, int q2) {
  43. if (q1 <= l && r <= q2) {
  44. return st[o];
  45. }
  46. down(o);
  47. Node ret;
  48. bool ex=0;
  49. if (q1 <= mid) ret = query(lch, l, mid, q1, q2), ex=1;
  50. if (mid < q2) {
  51. if (ex) ret = ret + query(rch, mid+1, r, q1, q2);
  52. else ret = query(rch, mid + 1, r, q1, q2);
  53. }
  54. return ret;
  55. }
  56. void change(int o, int l, int r, int q1, int q2, int q3) {
  57. if (q1 <= l && r <= q2) mkco(o, q3);
  58. else {
  59. down(o);
  60. if (q1 <= mid) change(lch, l, mid, q1, q2, q3);
  61. if (mid < q2) change(rch, mid+1, r, q1, q2, q3);
  62. up(o);
  63. }
  64. }
  65. inline int fix(long long x) {return (s + x*(n+r))%n;}
  66. int main() {
  67. freopen(file"in", "r", stdin);
  68. freopen(file"out", "w", stdout);
  69. scanf("%d%d", &n, &c);
  70. build(1, 0, n-1);
  71. scanf("%d", &q);
  72. for (int t = 1; t <= q; t++) {
  73. scanf("%s", cmd);
  74. if (cmd[0] == 'R') {
  75. int x; scanf("%d", &x);
  76. s = fix(n-x);
  77. }
  78. else if (cmd[0] == 'F') r *= -1;
  79. else if (cmd[0] == 'S') {
  80. int i, j;scanf("%d%d", &i, &j);
  81. i=fix(i-1), j=fix(j-1);
  82. Node x = query(1, 0, n-1, i, i), y = query(1, 0, n-1, j, j);
  83. change(1, 0, n-1, i, i, y.c[0]), change(1, 0, n-1, j, j, x.c[1]);
  84. }
  85. else if (cmd[0] == 'P') {
  86. int i, j, k; scanf("%d%d%d", &i, &j, &k);
  87. i=fix(i-1), j=fix(j-1);
  88. if (r == -1) std::swap(i, j);
  89. if (i <= j) change(1, 0, n-1, i, j, k);
  90. else change(1, 0, n-1, i, n-1, k), change(1, 0, n-1, 0, j, k);
  91. }
  92. else if (cmd[0] == 'C' && cmd[1] != 'S') printf("%d\n", std::max(st[1].s - (st[1].c[0] == st[1].c[1]), 1));
  93. else {
  94. int i, j;scanf("%d%d", &i, &j);
  95. i=fix(i-1), j=fix(j-1);
  96. Node x;
  97. if (r == -1) std::swap(i, j);
  98. if (i <= j) x = query(1, 0, n-1, i, j);
  99. else {
  100. x = query(1, 0, n-1, i, n-1);
  101. x = x + query(1, 0, n-1, 0, j);
  102. }
  103. printf("%d\n", x.s);
  104. }
  105. }
  106. }