记录编号 390945 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2013] K大数查询 最终得分 100
用户昵称 GravatarsssSSSay 是否通过 通过
代码语言 C++ 运行时间 0.525 s
提交时间 2017-04-04 18:27:57 内存使用 43.60 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #define INF 1e9 + 7
  6. using namespace std;
  7. const int Maxn = 510000;
  8. struct node {
  9. int p,a,b,c,w,ans;
  10. } q[Maxn], q1[Maxn], q2[Maxn];
  11. int n,m,t1[Maxn],t2[Maxn],temp[Maxn],w[Maxn];
  12. bool vis[Maxn];
  13. void Add(int x,int c) {
  14. for(int i = x; i <= n; i += i & (-i)) {
  15. t1[i] += c;
  16. t2[i] += c * x;
  17. }
  18. }
  19. int read(){
  20. int x=0; char ch=getchar();
  21. while (ch<'0' || ch>'9') ch=getchar();
  22. while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
  23. return x;
  24. }
  25.  
  26. bool comp(node a,node b) {return a.w < b.w;}
  27. int Query(int x,int temp = 0) {
  28. for(int i = x; i; i -= i & (-i))temp += (x + 1) * t1[i] - t2[i];
  29. return temp;
  30. }
  31. int S = 0;
  32. void Solve(int l,int r,int a,int b) {
  33. if(a > b) return;
  34. if(l == r) {
  35. for(int i = a; i <= b; ++i) {
  36. if(q[i].p == 2) q[i].ans = l;
  37. }
  38. return;
  39. }
  40. int mid = (l + r) / 2;
  41. for(int i = a; i <= b; ++i) {
  42. if(q[i].p == 1 && q[i].c > mid) {
  43. Add(q[i].a, 1);
  44. Add(q[i].b + 1, -1);
  45. }
  46. else if(q[i].p == 2){
  47. temp[i] = Query(q[i].b) - Query(q[i].a - 1);
  48. }
  49. }
  50. for(int i = a; i <= b; ++i) {
  51. if(q[i].p == 1 && q[i].c > mid) {
  52. Add(q[i].a, -1);
  53. Add(q[i].b + 1, 1);
  54. }
  55. }
  56. int l1 = 0,l2 = 0;
  57. for(int i = a; i <= b; ++i) {
  58. if(q[i].p == 2) {
  59. if(temp[i] < q[i].c) {
  60. q[i].c -= temp[i];
  61. q1[++l1] = q[i];
  62. }
  63. else q2[++l2] = q[i];
  64. }
  65. else {
  66. if(q[i].c <= mid) q1[++l1] = q[i];
  67. else q2[++l2] = q[i];
  68. }
  69. }
  70. for(int i = a, j = 1; i <= b; ++i, ++j) {
  71. if(j <= l1) q[i] = q1[j];
  72. else q[i] = q2[j - l1];
  73. }
  74. Solve(l,mid,a,a + l1 - 1);
  75. Solve(mid + 1,r,a + l1,b);
  76. }
  77. int main() {
  78. freopen("zjoi13_sequence.in","r",stdin);
  79. freopen("zjoi13_sequence.out","w",stdout);
  80. n = read(); m = read();
  81. for(int i = 1, p, a, b, c; i <= m; ++i) {
  82. p = read(); a = read(); b = read(); c = read();
  83. q[i].p = p; q[i].c = c;
  84. q[i].a = a; q[i].b = b;
  85. q[i].w = i;
  86. }
  87. Solve(1,n,1,m);
  88. sort(q + 1,q + 1 + m,comp);
  89. for(int j = 1; j <= m; ++j) {
  90. int i = q[j].w;
  91. if(q[i].p == 2) printf("%d\n",q[i].ans);
  92. }
  93. return 0;
  94. }