题目描述

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 不然会出错

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int N=,INF=;
struct node
{
node *child[],*fa;
int x,mark,size,val;long long sum;
}a[N];
node *pos=a,*root,*newone;
void check(node *r);
void updata(node *&r)
{
if(r){
r->sum=(r->child[]?r->child[]->sum:)+(r->child[]?r->child[]->sum:)+r->val;
r->size=(r->child[]?r->child[]->size:)+(r->child[]?r->child[]->size:)+;
}
}
void pushdown(node *&r)
{
if(!r || !r->mark)return ;
if(r->child[])r->child[]->mark+=r->mark,r->child[]->sum+=(ll)r->mark*r->child[]->size,r->child[]->val+=r->mark;
if(r->child[])r->child[]->mark+=r->mark,r->child[]->sum+=(ll)r->mark*r->child[]->size,r->child[]->val+=r->mark;
updata(r);
r->mark=;
}
void rotate(node *&r,bool t)//0left 1right
{
node *y=r->fa;
pushdown(y);
pushdown(r);
y->child[!t]=r->child[t];
if(r->child[t])r->child[t]->fa=y;
if(y->fa)y->fa->child[y->fa->child[]==y]=r;
r->fa=y->fa;
r->child[t]=y;
y->fa=r;
updata(r);
updata(y);
updata(r->fa);
}
void splay(node *r,node *g)
{
while(r->fa!=g)
{
if(r->fa->fa==g)rotate(r,r->fa->child[]==r);
else
{
node *y=r->fa;
bool t=y->fa->child[]==y;
if(y->child[t]==r)rotate(r,!t);
else rotate(y,t);
rotate(r,t);
}
}
if(g==NULL)root=r;
}
void newnode(node *&r,int key,int val,node *fa)
{
r=pos++;
r->fa=fa;
r->child[]=r->child[]=NULL;
r->x=key;r->val=val;r->mark=;r->size=;r->sum=val;
}
void insert(node *&r,int key,int val,node *fa)
{
if(r==NULL){
newnode(r,key,val,fa);
splay(r,NULL);
return ;
}
else {
pushdown(r);
insert(r->child[key>r->x],key,val,r);
}
}
node *pre,*nxt;
void getpre(node *r,int key)
{
if(r==NULL)return ;
if(r->x>=key)getpre(r->child[],key);
else pre=r,getpre(r->child[],key);
}
void getnext(node *r,int key)
{
if(r==NULL)return ;
if(r->x<=key)getnext(r->child[],key);
else nxt=r,getnext(r->child[],key);
}
void work(int l,int r)
{
getpre(root,l);getnext(root,r);
splay(pre,NULL);splay(nxt,pre);
updata(root->child[]);updata(root);
}
void Delet(int l,int r)
{
work(l,r);
root->child[]->child[]=NULL;
updata(root->child[]);updata(root);
}
void add(int l,int r,int to)
{
work(l,r);
root->child[]->child[]->mark+=to;
root->child[]->child[]->sum+=(ll)to*root->child[]->child[]->size;
root->child[]->child[]->val+=to;
updata(root->child[]);updata(root);
}
long long ask(int l,int r)
{
work(l,r);
node *y=root->child[]->child[];
return y==NULL?:y->sum;
}
void haha()
{
insert(root,-INF,,NULL);
insert(root,INF,,NULL);
}
int main()
{
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
haha();
int n;
char ch;int x,y,z;
scanf("%d",&n);
while(n--)
{
scanf("\n%c%d%d",&ch,&x,&y);
if(ch=='I')insert(root,x,y,NULL);
if(ch=='D')Delet(x,y);
if(ch=='M'){
scanf("%d",&z);
add(x,y,z);
}
if(ch=='Q')printf("%lld\n",ask(x,y));
}
return ;
}

[模版]平衡树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. Flask 扩展 国际化 本地化

    pip install flask-babel 先初始化一个Flask-Babel的实例 from flask import Flask from flask.ext.babel import Bab ...

  2. 需求分析&原型改进

    需求&原型改进 一.给目标用户展现原型,与目标用户进一步沟通理解需求. 1.用户痛点:需要随时随地练习四则运算,并能看到用户的统计数据. 2.用户反馈:较好地解决练习需求,若能加入班级概念则更 ...

  3. 冲刺每日报告--Day1

    敏捷冲刺每日报告--Day1 情况简介 由于李世钰同学出差了,周六才能回来.所以我们只能先写爬虫,封装代码提供接口等他回来调用. 任务进度 赵坤:编写了基本爬虫代码,目前能在国内有版权的B站.爱奇艺中 ...

  4. mysql基础篇 - 数据库及表的修改和删除

    基础篇 - 数据库及表的修改和删除         修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先 ...

  5. Struts2之Struts2的标签库

    前言: Struts2提供了大量的标签 ,用来帮助开发表现层页面,这些表现一方面解决了美观性的需求,因为它们具有html标签一样的外观,另一方面它们解决了功能性的需求, 因为它们具有jsp脚本一样的逻 ...

  6. Linux CentOS7.0 (03)安装验证 docker

    一.安装docker 1.升级 Linux 的软件包和内核 sudo yum update 2.安装 docker (1) sudo yum install docker  (2).验证docker安 ...

  7. NOPI实现导入导出泛型List,支持自定义列

    概述 业务上需要自定义列的Excel的导入导出,在网上看了好多资料,很多都是有Bug而且都是支持Excel和DataTable的转换,所以自己总结了一下,应用.NET平台上的NPOI封装了支持自定义列 ...

  8. python开发:python基本数据类型

    运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31- ...

  9. Help Jimmy ~poj-1661 基础DP

    Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...

  10. semver(Semantic Versioning)

    Based on semver, you can use Hyphen Ranges X.Y.Z - A.B.C 1.2.3-2.3.4 Indicates >=1.2.3 <=2.3.4 ...