记录编号 398354 评测结果 AAAAAAAAAA
题目名称 [JSOI 2008] 最大数 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 C++ 运行时间 3.168 s
提交时间 2017-04-22 07:31:22 内存使用 12.52 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <iomanip>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #define ll long long
  8. using namespace std;
  9. const ll maxn=200010;
  10. ll n,d,mem;
  11. ll len;
  12. struct q
  13. {
  14. ll maxx;
  15. };
  16. q node[maxn*8];
  17. inline void insert(ll o,ll l,ll r,ll nl,ll nr,ll data)
  18. {
  19. if(l>=nl&&r<=nr)
  20. {
  21. node[o].maxx=data;
  22. return;
  23. }
  24. ll m=(l+r)/2;
  25. if(m>=nl)
  26. {
  27. insert(o*2,l,m,nl,nr,data);
  28. }
  29. if(m<nr)
  30. {
  31. insert(o*2+1,m+1,r,nl,nr,data);
  32. }
  33. node[o].maxx=max(node[o*2].maxx,node[o*2+1].maxx);
  34. }
  35. inline ll find(ll o,ll l,ll r,ll nl,ll nr)
  36. {
  37. if(l>=nl&&r<=nr)
  38. {
  39. //mem=max(mem,node[o].maxx); //错在这里,因为记忆变量会被多次调用,所以改变了,就是那种所需区间也被分割的情况!
  40. return node[o].maxx;
  41. }
  42. ll m=(l+r)/2;
  43. ll ans=-0x7fffffff;
  44. if(m>=nl)
  45. {
  46. ans=max(ans,find(o*2,l,m,nl,nr));
  47. }
  48. if(m<nr)
  49. {
  50. ans=max(ans,find(o*2+1,m+1,r,nl,nr));
  51. }
  52. return ans;
  53. }
  54. int main()
  55. {
  56. freopen("bzoj_1012.in","r",stdin);
  57. freopen("bzoj_1012.out","w",stdout);
  58. cin>>n>>d;
  59. ll t=n;
  60. while(t--)
  61. {
  62. char a;
  63. ll x;
  64. cin>>a>>x;
  65. if(a=='A')
  66. {
  67. len++;
  68. n++;
  69. insert(1,1,maxn,len,len,(x+mem)%d);
  70. }
  71. if(a=='Q')
  72. {
  73. mem=find(1,1,maxn,len-x+1,len);
  74. cout<<mem<<endl;
  75. //cout<<len<<endl;
  76. }
  77. }
  78. return 0;
  79. }