题目描述

1. 加入:一个新的成员加入同好会,我会分配给他一个没有使用的id,并且询问他的兴趣值val。
2. 修改:id在区间[a,b]内的成员,兴趣值同时改变k,k有可能是负数,表示他们失去了对同好会的兴趣。
3. 退出:id在区间[a,b]内的成员要退出同好会,虽说是区间,也有可能只有1个人。
4. 询问:老师会问我在区间[a,b]内的成员总的兴趣值。

输入

第1行:1个正整数n,表示操作数量,100≤n≤200,000
第2..n+1行:可能包含下面4种规则:
1个字母'I',紧接着2个数字id,val,表示一个编号为id的新成员加入,其兴趣值为val,1≤id≤100,000,000,1≤val≤10,000,000,保证在团队中的每个人id都不相同。
1个字母'Q',紧接着2个数字a,b。表示询问团队中id在区间[a,b]的所有成员总兴趣值,保证区间内至少有一个成员,结果有可能超过int的范围。
1个字母'M',紧接着3个数字a,b,d,表示将团队中id在区间[a,b]的成员兴趣值都改变d,其中d有可能为负数。保证操作之后每个成员的兴趣值仍然在0~10,000,000。
1个字母'D',紧接着2个数字a,b,表示将团队中id在区间[a,b]的成员除去。
注意有可能出现一个id为1的成员加入团队,被除去之后,又有一个新的id为1的成员加入团队的情况。

输出

若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解

样例输入

9 I 1 1 I 2 2 I 3 3 Q 1 3 M 1 2 2 Q 1 3 D 2 3 I 4 2 Q 1 4

样例输出

6 10 5
 
需注意的细节:
1.Delet Add rotate等地方要updata
2.insert rotate处标记要下移
3.size*mark时要转(Long Long)
4.关键是时时刻刻都要先pushdown再updata 和 rotate 不然会出错

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<cstdlib>
  7. #include<ctime>
  8. using namespace std;
  9. typedef long long ll;
  10. const int N=,INF=;
  11. struct node
  12. {
  13. node *child[],*fa;
  14. int x,mark,size,val;long long sum;
  15. }a[N];
  16. node *pos=a,*root,*newone;
  17. void check(node *r);
  18. void updata(node *&r)
  19. {
  20. if(r){
  21. r->sum=(r->child[]?r->child[]->sum:)+(r->child[]?r->child[]->sum:)+r->val;
  22. r->size=(r->child[]?r->child[]->size:)+(r->child[]?r->child[]->size:)+;
  23. }
  24. }
  25. void pushdown(node *&r)
  26. {
  27. if(!r || !r->mark)return ;
  28. if(r->child[])r->child[]->mark+=r->mark,r->child[]->sum+=(ll)r->mark*r->child[]->size,r->child[]->val+=r->mark;
  29. if(r->child[])r->child[]->mark+=r->mark,r->child[]->sum+=(ll)r->mark*r->child[]->size,r->child[]->val+=r->mark;
  30. updata(r);
  31. r->mark=;
  32. }
  33. void rotate(node *&r,bool t)//0left 1right
  34. {
  35. node *y=r->fa;
  36. pushdown(y);
  37. pushdown(r);
  38. y->child[!t]=r->child[t];
  39. if(r->child[t])r->child[t]->fa=y;
  40. if(y->fa)y->fa->child[y->fa->child[]==y]=r;
  41. r->fa=y->fa;
  42. r->child[t]=y;
  43. y->fa=r;
  44. updata(r);
  45. updata(y);
  46. updata(r->fa);
  47. }
  48. void splay(node *r,node *g)
  49. {
  50. while(r->fa!=g)
  51. {
  52. if(r->fa->fa==g)rotate(r,r->fa->child[]==r);
  53. else
  54. {
  55. node *y=r->fa;
  56. bool t=y->fa->child[]==y;
  57. if(y->child[t]==r)rotate(r,!t);
  58. else rotate(y,t);
  59. rotate(r,t);
  60. }
  61. }
  62. if(g==NULL)root=r;
  63. }
  64. void newnode(node *&r,int key,int val,node *fa)
  65. {
  66. r=pos++;
  67. r->fa=fa;
  68. r->child[]=r->child[]=NULL;
  69. r->x=key;r->val=val;r->mark=;r->size=;r->sum=val;
  70. }
  71. void insert(node *&r,int key,int val,node *fa)
  72. {
  73. if(r==NULL){
  74. newnode(r,key,val,fa);
  75. splay(r,NULL);
  76. return ;
  77. }
  78. else {
  79. pushdown(r);
  80. insert(r->child[key>r->x],key,val,r);
  81. }
  82. }
  83. node *pre,*nxt;
  84. void getpre(node *r,int key)
  85. {
  86. if(r==NULL)return ;
  87. if(r->x>=key)getpre(r->child[],key);
  88. else pre=r,getpre(r->child[],key);
  89. }
  90. void getnext(node *r,int key)
  91. {
  92. if(r==NULL)return ;
  93. if(r->x<=key)getnext(r->child[],key);
  94. else nxt=r,getnext(r->child[],key);
  95. }
  96. void work(int l,int r)
  97. {
  98. getpre(root,l);getnext(root,r);
  99. splay(pre,NULL);splay(nxt,pre);
  100. updata(root->child[]);updata(root);
  101. }
  102. void Delet(int l,int r)
  103. {
  104. work(l,r);
  105. root->child[]->child[]=NULL;
  106. updata(root->child[]);updata(root);
  107. }
  108. void add(int l,int r,int to)
  109. {
  110. work(l,r);
  111. root->child[]->child[]->mark+=to;
  112. root->child[]->child[]->sum+=(ll)to*root->child[]->child[]->size;
  113. root->child[]->child[]->val+=to;
  114. updata(root->child[]);updata(root);
  115. }
  116. long long ask(int l,int r)
  117. {
  118. work(l,r);
  119. node *y=root->child[]->child[];
  120. return y==NULL?:y->sum;
  121. }
  122. void haha()
  123. {
  124. insert(root,-INF,,NULL);
  125. insert(root,INF,,NULL);
  126. }
  127. int main()
  128. {
  129. freopen("pp.in","r",stdin);
  130. freopen("pp.out","w",stdout);
  131. haha();
  132. int n;
  133. char ch;int x,y,z;
  134. scanf("%d",&n);
  135. while(n--)
  136. {
  137. scanf("\n%c%d%d",&ch,&x,&y);
  138. if(ch=='I')insert(root,x,y,NULL);
  139. if(ch=='D')Delet(x,y);
  140. if(ch=='M'){
  141. scanf("%d",&z);
  142. add(x,y,z);
  143. }
  144. if(ch=='Q')printf("%lld\n",ask(x,y));
  145. }
  146. return ;
  147. }

[模版]平衡树splay2的更多相关文章

  1. hihocoder#1333 : 平衡树·Splay2 (区间操作)

    题面: #1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊! ...

  2. Hihocoder #1333 : 平衡树·Splay2

    1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙 ...

  3. hihocoder #1333 : 平衡树·Splay2

    描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙管理一下团队的人员,但是感觉好难啊. 小Hi:说来听听? 小Ho:事情是这样的.我们有一个运动同好会 ...

  4. 【hihocoder 1333】平衡树·Splay2

    [题目链接]:http://hihocoder.com/problemset/problem/1333 [题意] [题解] 伸展树; 要求提供操作: 1.插入一个元素,两个权值,id作为查找的比较权值 ...

  5. Hihocoder 1333 (splay)

    Problem 平衡树 splay2 题目大意 维护一个序列,支持四种操作: 操作1:添加一个数,编号为x,权值为y. 操作2:删除编号在区间[x,y]内的数. 操作3:将编号在区间[x,y]内的数的 ...

  6. tyvj 1729 文艺平衡树

    文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...

  7. 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1347  Solved: 724[Submit][Stat ...

  8. BZOJ3224普通平衡树【Splay】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 11751  Solved: 5013 Descriptio ...

  9. 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

    平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...

随机推荐

  1. 201621123068 Week03-面向对象入门

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...

  2. faster-rcnn 结构杂谈

    faster-rcnn结构图: (只截取了最难理解的部分) 这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了.要看源码!!要看源码!!要看源码 !!重要的事情说三遍. 关键的层: ...

  3. JAVA_SE基础——59.权限访问修饰符

    了解了包的概念,就可以系统的介绍Java中的访问控制级别.在Java中,针对类.成员方法和属性提供了四种访问级别,分别是private.default.protected和public. 权限访问修饰 ...

  4. URL编码和Base64编码 (转)

    我们经常会遇到所谓的URL编码(也叫百分号编码)和Base64编码.      先说一下Bsae64编码.BASE64编码是一种常用的将二进制数据转换为64个可打印字符的编码,常用于在通常处理文本数据 ...

  5. ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]

    org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: org.apache.ib ...

  6. mqtt paho ssl java端代码

    参考链接:http://blog.csdn.net/lingshi210/article/details/52439050 mqtt 的ssl配置可以参阅 http://houjixin.blog.1 ...

  7. Spring知识点回顾(01)Java Config

    Spring知识点回顾(01) 一.Java Config 1.服务和服务注入 2.Java 注解 :功能更强一些 3.测试验证 二.注解注入 1.服务和服务注入 2.配置加载 3.测试验证 三.总结 ...

  8. 云计算(2)it 是什么

    2015年,全世界在it上面的花费达到3亿8千亿美金之多. 云数据中心:核心基础架构,云计算的物理载体,提供数据处理.存储和高性能计算支撑,包括服务器.存储.冷却.机房空间和能耗管理等. 超大规模的云 ...

  9. 一个适用于单页应用,返回原始滚动条位置的demo

    如题,最近做一个项目时,由于页面太长,跳转后在返回又回到初始位置,不利于用户体验,需要每次返回到用户离开该页面是的位置.由于是移动端项目,使用了移动端的套ui框架framework7,本身框架的机制是 ...

  10. 复习HTML+CSS(3)

    n  超级链接 l  语法格式:<a 属性 = "值">---</a> l  常用属性: n  Href:目标文件的地址URL,该URL可以是相对地址,也可 ...