记录编号 489434 评测结果 AAAAAAAAAA
题目名称 [HNOI 2004] 宠物收养所 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 0.386 s
提交时间 2018-03-02 15:02:07 内存使用 1.29 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int inf=8e4+10;
  5. const int mod=1e6;
  6. const double alpha=0.75;
  7. LL ans;
  8. int ls[inf],rs[inf],siz[inf],val[inf];
  9. int n,sz,rt;
  10. int p[inf],cnt;
  11. int flag=-1;
  12. int id,f;
  13. void update(int x){
  14. siz[x]=siz[ls[x]]+siz[rs[x]]+1;
  15. }
  16. int rebuild(int l,int r){
  17. if(l>r)return 0;
  18. int mid=(l+r)>>1;
  19. int x=p[mid];
  20. siz[x]=1;
  21. ls[x]=rebuild(l,mid-1);
  22. rs[x]=rebuild(mid+1,r);
  23. update(x);
  24. return x;
  25. }
  26. void insert(int &x,int y){
  27. if(!x){
  28. x=++sz;
  29. siz[x]=1;
  30. val[x]=y;
  31. return ;
  32. }
  33. if(y<val[x])insert(ls[x],y);
  34. else insert(rs[x],y);
  35. update(x);
  36. if(max(siz[ls[x]],siz[rs[x]])>alpha*siz[x])id=x;
  37. if(ls[x]==id || rs[x]==id)f=x;
  38. }
  39. void dfs(int x){
  40. if(ls[x])dfs(ls[x]);
  41. p[++cnt]=x;
  42. if(rs[x])dfs(rs[x]);
  43. }
  44. void work(int x){
  45. id=-1;
  46. insert(rt,x);
  47. if(id!=-1){
  48. if(id==rt)f=0;
  49. cnt=0;
  50. dfs(id);
  51. int u=rebuild(1,cnt);
  52. if(ls[f]==id)ls[f]=u;
  53. else if(rs[f]==id)rs[f]=u;
  54. else rt=u;
  55. }
  56. }
  57. void del(int &x,int y){
  58. if(val[x]==y){
  59. if((!ls[x]) && (!rs[x]))x=0;
  60. else if(!ls[x])x=rs[x];
  61. else if(!rs[x])x=ls[x];
  62. else {
  63. int tmp=ls[x];
  64. while(rs[tmp])tmp=rs[tmp];
  65. val[x]=val[tmp];
  66. del(ls[x],val[x]);
  67. update(x);
  68. }
  69. return ;
  70. }
  71. if(y<val[x])del(ls[x],y);
  72. else del(rs[x],y);
  73. update(x);
  74. }
  75. int pre(int x,int y,int Max){
  76. if(!x)return Max;
  77. if(val[x]<=y){
  78. Max=max(Max,val[x]);
  79. return pre(rs[x],y,Max);
  80. }
  81. else return pre(ls[x],y,Max);
  82. }
  83. int succ(int x,int y,int Min){
  84. if(!x)return Min;
  85. if(val[x]>=y){
  86. Min=min(Min,val[x]);
  87. return succ(ls[x],y,Min);
  88. }
  89. else return succ(rs[x],y,Min);
  90. }
  91. int main()
  92. {
  93. freopen("pet.in","r",stdin);
  94. freopen("pet.out","w",stdout);
  95. scanf("%d",&n);
  96. for(int i=1;i<=n;i++){
  97. int x,y;
  98. scanf("%d%d",&x,&y);
  99. if(flag==-1){
  100. work(y);
  101. flag=x;
  102. }
  103. else if(flag==x){
  104. work(y);
  105. }
  106. else {
  107. int tmp1=pre(rt,y,-0x3fffffff),tmp2=succ(rt,y,0x3fffffff);
  108. if(tmp2-y<y-tmp1){
  109. del(rt,tmp2);
  110. ans+=tmp2-y;
  111. ans%=mod;
  112. }
  113. else {
  114. del(rt,tmp1);
  115. ans+=y-tmp1;
  116. ans%=mod;
  117. }
  118. if(!siz[rt])flag=-1;
  119. }
  120. }
  121. printf("%lld\n",ans);
  122. return 0;
  123. }