经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
[luogu2286][宠物收养所]
来源:cnblogs  作者:wxyww  时间:2018/12/3 10:13:38  对本文有异议

题目链接

思路

比较裸的一道平衡树的题。用一个变量S来表示当前树的情况,当S为负数时树内为宠物,当S为正数时树内为人。然后每次分情况讨论一下。如果树为空或者是与来的东西(人或宠物)与树内存的相同。那么就无法领养,直接将这个东西扔到树里。否则就从树里面找一个与当前值最接近的数字,然后统计进答案。

一开始把INF设的太小了影响了统计答案。

代码

  1. #include<cstdlib>
  2. #include<ctime>
  3. #include<cstdio>
  4. #include<iostream>
  5. #define ls TR[cur].ch[0]
  6. #define rs TR[cur].ch[1]
  7. using namespace std;
  8. typedef long long ll;
  9. const int N = 100000,mod = 1000000;
  10. const ll INF = 1e17 + 10;
  11. ll read() {
  12. ll x=0,f=1;char c=getchar();
  13. while(c<'0'||c>'9') {
  14. if(c=='-') f=-1;
  15. c=getchar();
  16. }
  17. while(c>='0'&&c<='9') {
  18. x=x*10+c-'0';
  19. c=getchar();
  20. }
  21. return x*f;
  22. }
  23. struct node {
  24. int ch[2],id;
  25. ll val;
  26. }TR[N];
  27. void rotate(int &cur,int f) {
  28. int son = TR[cur].ch[f];
  29. TR[cur].ch[f] = TR[son].ch[f ^ 1];
  30. TR[son].ch[f ^ 1] = cur;
  31. cur = son;
  32. }
  33. int tot;
  34. void insert(int &cur,int val) {
  35. if(!cur) {
  36. cur = ++tot;
  37. TR[cur].val = val;
  38. TR[cur].id = rand();
  39. return;
  40. }
  41. int d = val > TR[cur].val;
  42. insert(TR[cur].ch[d],val);
  43. if(TR[TR[cur].ch[d]].id < TR[cur].id) rotate(cur,d);
  44. }
  45. void del(int &cur,int val) {
  46. if(!cur) return;
  47. if(val == TR[cur].val) {
  48. if(!ls || !rs) {cur = ls + rs;return;}
  49. int d = TR[ls].id > TR[rs].val;
  50. rotate(cur,d);
  51. del(cur,val);
  52. }
  53. del(TR[cur].ch[val > TR[cur].val],val);
  54. }
  55. ll pred(int cur,int val) {
  56. if(!cur) return -INF;
  57. if(val <= TR[cur].val) return pred(ls,val);
  58. return max(TR[cur].val,pred(rs,val));
  59. }
  60. ll nex(int cur,int val) {
  61. if(!cur) return INF;
  62. if(val >= TR[cur].val) return nex(rs,val);
  63. return min(TR[cur].val,nex(ls,val));
  64. }
  65. int S;
  66. ll ans;
  67. int main() {
  68. srand(time(0));
  69. int n = read(),rt = 0;
  70. while(n--) {
  71. int bz = read(),x = read();
  72. if(bz == 0) {
  73. if(S <= 0) insert(rt,x);
  74. else {
  75. int k1 = pred(rt,x),k2 = nex(rt,x);
  76. int dele = k1;
  77. if(k2 - x < x - k1) dele = k2;
  78. ans += abs(dele - x);
  79. ans %= mod;
  80. del(rt,dele);
  81. }
  82. S--;
  83. }
  84. if(bz == 1) {
  85. if(S >= 0) insert(rt,x);
  86. else {
  87. int k1 = pred(rt,x),k2 = nex(rt,x);
  88. int dele = k1;
  89. if(k2 - x < x - k1) dele = k2;
  90. ans += abs(dele - x);
  91. ans %= mod;
  92. del(rt,dele);
  93. }
  94. S++;
  95. }
  96. }
  97. cout<<ans<<endl;
  98. }

一言

无论做什么,记得为自己而做,那就毫无怨言。 ——流金岁月

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号