记录编号 142380 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]stone 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.478 s
提交时间 2014-12-08 10:54:33 内存使用 4.74 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. #define sqr(x) ((x)*(x))
  7. const int SIZEN=40010,INF=0x7fffffff/2;
  8. class NODE{
  9. public:
  10. int a,b;
  11. int lc,rc;
  12. int mn;
  13. int lazy;
  14. #define a(x) Tree[x].a
  15. #define b(x) Tree[x].b
  16. #define lc(x) Tree[x].lc
  17. #define rc(x) Tree[x].rc
  18. #define mn(x) Tree[x].mn
  19. #define lazy(x) Tree[x].lazy
  20. }Tree[SIZEN*4];
  21. int tot=0;
  22. void pushdown(int x){
  23. if(!x||!lc(x)) return;
  24. mn(lc(x))+=lazy(x);lazy(lc(x))+=lazy(x);
  25. mn(rc(x))+=lazy(x);lazy(rc(x))+=lazy(x);
  26. lazy(x)=0;
  27. }
  28. void update(int x){
  29. if(!x||!lc(x)) return;
  30. mn(x)=min(mn(lc(x)),mn(rc(x)));
  31. }
  32. int build(int l,int r,int s[]){
  33. int p=++tot;
  34. a(p)=l;b(p)=r;lazy(p)=0;
  35. if(l==r){
  36. lc(p)=rc(p)=0;
  37. mn(p)=s[l];
  38. }
  39. else{
  40. int mid=(l+r)/2;
  41. lc(p)=build(l,mid,s);
  42. rc(p)=build(mid+1,r,s);
  43. update(p);
  44. }
  45. return p;
  46. }
  47. int query(int x,int l,int r){
  48. if(!x||a(x)>r||b(x)<l) return INF;
  49. pushdown(x);
  50. if(a(x)>=l&&b(x)<=r) return mn(x);
  51. else return min(query(lc(x),l,r),query(rc(x),l,r));
  52. }
  53. void change(int x,int l,int r,int t){//[l,r]区间加t
  54. if(!x||a(x)>r||b(x)<l) return;
  55. pushdown(x);
  56. if(a(x)>=l&&b(x)<=r){
  57. mn(x)+=t;
  58. lazy(x)+=t;
  59. }
  60. else{
  61. change(lc(x),l,r,t);
  62. change(rc(x),l,r,t);
  63. update(x);
  64. }
  65. }
  66. int N,M;
  67. int A[SIZEN]={0};
  68. int S[SIZEN]={0};
  69. int K[SIZEN]={0};
  70. int L[SIZEN],R[SIZEN];
  71. int f_Root,g_Root;
  72. //f[i]=S[i]-TR[i],g[i]=TL[i]-S[i]
  73. //需要对任意j>i都有f[j]+g[i]>=0
  74. void work(void){
  75. f_Root=build(0,N,S);
  76. for(int i=1;i<=N;i++) S[i]*=-1;
  77. g_Root=build(0,N,S);
  78. for(int i=1;i<=M;i++){
  79. /*
  80. 假设这次是x~y,选的石头数量为t
  81. 那么TR[y]~TR[N]+=t,f[y]~f[N]-=t
  82. 同时TL[x]~TL[N]+=t,g[x]~g[N]+=t
  83. 对于x'<x<=y<=y'的(x',y'),(f[y']+g[x'])-=t
  84. 对于x<=x'<=y'<=y的(x',y'),(f[y']+g[x'])+=t,但never mind
  85. */
  86. int now=query(f_Root,R[i],N)+query(g_Root,0,L[i]-1);
  87. now=min(now,K[i]);
  88. printf("%d\n",now);
  89. change(f_Root,R[i],N,-now);
  90. change(g_Root,L[i],N,now);
  91. }
  92. }
  93. void read(void){
  94. scanf("%d",&N);
  95. int x,y,z,P;
  96. scanf("%d%d%d%d",&x,&y,&z,&P);
  97. for(int i=1;i<=N;i++){
  98. A[i]=sqr(i-x)%P;
  99. A[i]+=sqr(i-y)%P;A[i]%=P;
  100. A[i]+=sqr(i-z)%P;A[i]%=P;
  101. S[i]=S[i-1]+A[i];
  102. }
  103. scanf("%d",&M);
  104. scanf("%d%d%d%d%d%d",&K[1],&K[2],&x,&y,&z,&P);
  105. for(int i=3;i<=M;i++){
  106. K[i]=(x*K[i-1])%P;
  107. K[i]+=(y*K[i-2])%P;K[i]%=P;
  108. K[i]+=z%P;K[i]%=P;
  109. }
  110. for(int i=1;i<=M;i++) scanf("%d%d",&L[i],&R[i]);
  111. }
  112. int main(){
  113. freopen("nt2011_stone.in","r",stdin);
  114. freopen("nt2011_stone.out","w",stdout);
  115. read();
  116. work();
  117. return 0;
  118. }