hihocoder #1333 : 平衡树·Splay2
描述
小Ho:好麻烦啊~~~~~
小Hi:小Ho你在干嘛呢?
小Ho:我在干活啊!前几天老师让我帮忙管理一下团队的人员,但是感觉好难啊。
小Hi:说来听听?
小Ho:事情是这样的。我们有一个运动同好会,每天都有人加入或者退出,所以老师让我帮忙管理一下人员。每个成员有一个互不相同的id和他对我们同好会的兴趣值val,每隔一段时间一些成员的兴趣值就会发生变化。老师有时候也会问我一些成员的兴趣值。
小Hi:所以你就需要一个表格来管理信息咯?
小Ho:是啊,但是我们同好会的成员实在是太多了!我感觉完全搞不定啊。
小Hi:这样啊,那不如让我来帮帮你吧!
小Ho:真的吗?
小Hi:当然是真的啦,小Ho,你先告诉我有多少种需要完成的事情?
小Ho:一共有4种情况:
1. 加入:一个新的成员加入同好会,我会分配给他一个没有使用的id,并且询问他的兴趣值val。
2. 修改:id在区间[a,b]内的成员,兴趣值同时改变k,k有可能是负数,表示他们失去了对同好会的兴趣。
3. 退出:id在区间[a,b]内的成员要退出同好会,虽说是区间,也有可能只有1个人。
4. 询问:老师会问我在区间[a,b]内的成员总的兴趣值。
小Hi:我明白了,让我想一想该如何解决。
输入
第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
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std; typedef long long LL;
const int N = 2e5+, M = 4e4+, mod = 1e9+, inf = 0x3f3f3f3f; int c[N][],mx[N],size[N],rev[N],fa[N],ID[N],t1,t2,id[N],n,m,rt,sz;
LL v[N],tag[N],sum[N]; inline void push_up(int k) {
int l = c[k][], r = c[k][];
sum[k] = sum[l] + sum[r] + v[k];
size[k] = size[l] + size[r] + ;
}
inline void push_down(int k) {
int l = c[k][], r = c[k][], t = tag[k];
if(t) {
tag[k] = ;
if(l) {tag[l] += t,v[l]+=t,sum[l]+=1LL*size[l]*t;}
if(r) {tag[r] += t,v[r]+=t,sum[r]+=1LL*size[r]*t;}
}
}
inline void rotate(int x,int &k) {
int y = fa[x], z = fa[y], l ,r;
push_down(z);
push_down(y);
push_down(x);
if(c[y][] == x) l=;else l=;
r=l^;
if(y == k) k = x;
else {if(c[z][] == y) c[z][] = x;else c[z][] = x;}
fa[x]=z;
fa[y]=x;
fa[c[x][r]]=y;
c[y][l]=c[x][r];
c[x][r]=y;
push_up(y);
push_up(x);
}
inline void splay(int x,int &k) {
push_down(k);
while(x!=k) {
int y = fa[x], z = fa[y];
if(y!=k) {
if(c[y][] == x ^ c[z][] == y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
} inline void ask_befor(int k,int x)
{
push_down(k);
if(k==)return;
if(ID[k]<=x){t1=k;ask_befor(c[k][],x);}
else ask_befor(c[k][],x);
}
inline void ask_after(int k,int x)
{
push_down(k);
if(k==)return;
if(ID[k]>=x){t2=k;ask_after(c[k][],x);}
else ask_after(c[k][],x);
}
inline void update(int l,int r,int val) {
ask_befor(rt,l-),ask_after(rt,r+);
int x = t1, y = t2;
splay(x,rt);splay(y,c[x][]);
int z = c[y][];
tag[z] += val;
v[z] += val;
sum[z] +=1LL*val*size[z];
} inline void query(int l,int r) {
ask_befor(rt,l-), ask_after(rt,r+);
int x = t1, y = t2;
splay(x,rt),splay(y,c[x][]);
int z = c[y][];
printf("%lld\n",sum[z]);
}
inline void ins(int &k,int ids,int val,int last) {
push_down(k);
if(k == ) {
++sz;
size[sz]=;
k = sz;
v[k] = val;
sum[k] = val;
fa[k] = last;
ID[k] = ids;
return ;
}
if(ids < ID[k]) ins(c[k][],ids,val,k);
else ins(c[k][],ids,val,k);
push_up(k);
}
inline void Delet(int l,int r) {
ask_befor(rt,l-), ask_after(rt,r+);
int x = t1, y = t2;
splay(x,rt),splay(y,c[x][]);
c[y][] = ;
}
int main() {
sz = ;
ins(rt,-,,);
ins(rt,,,rt);
scanf("%d",&n);
while(n--)
{
char ch[];
int l,r,val;
scanf("%s%d%d",ch,&l,&r);
if(ch[] == 'I') {
ins(rt,l,r,rt);
splay(sz,rt);
} else if(ch[] == 'Q') {
query(l,r);
} else if(ch[] == 'M') {
scanf("%d",&val);
update(l,r,val);
} else if(ch[] == 'D') {
Delet(l,r);
}
}
return ;
}
hihocoder #1333 : 平衡树·Splay2的更多相关文章
- hihocoder#1333 : 平衡树·Splay2 (区间操作)
题面: #1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~~~~~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊! ...
- Hihocoder #1333 : 平衡树·Splay2
1333 : 平衡树·Splay2 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:好麻烦啊~ 小Hi:小Ho你在干嘛呢? 小Ho:我在干活啊!前几天老师让我帮忙 ...
- Hihocoder 1325 平衡树·Treap(平衡树,Treap)
Hihocoder 1325 平衡树·Treap(平衡树,Treap) Description 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉 ...
- HihoCoder 1325 平衡树·Treap
HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
- Hihocoder 1333 (splay)
Problem 平衡树 splay2 题目大意 维护一个序列,支持四种操作: 操作1:添加一个数,编号为x,权值为y. 操作2:删除编号在区间[x,y]内的数. 操作3:将编号在区间[x,y]内的数的 ...
- 【hihocoder 1333】平衡树·Splay2
[题目链接]:http://hihocoder.com/problemset/problem/1333 [题意] [题解] 伸展树; 要求提供操作: 1.插入一个元素,两个权值,id作为查找的比较权值 ...
- [模版]平衡树splay2
题目描述 1. 加入:一个新的成员加入同好会,我会分配给他一个没有使用的id,并且询问他的兴趣值val. 2. 修改:id在区间[a,b]内的成员,兴趣值同时改变k,k有可能是负数,表示他们失去了对同 ...
- hihocoder #1034 : 毁灭者问题 平衡树(set)+线段树
#1034 : 毁灭者问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位. 毁 ...
随机推荐
- 【leetcode】Maximum Subarray
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- poj 1220(短除法)
http://poj.org/problem?id=1220 题意:进制转换,把a进制转换为b进制. 如果数据不大的话,那么这个题还是很简单的,但这个题就是数据范围太大,所以这里可以采用短除法来做. ...
- Linux设置交换分区swap
参考: http://www.vpser.net/opt/vps-add-swap.html https://www.zntec.cn/archives/vps-swap.html http://yz ...
- 【转】Git如何Check Out出指定文件或者文件夹
[转]Git如何Check Out出指定文件或者文件夹http://www.handaoliang.com/a/20140506/195406.html 在进行项目开发的时候,有时候会有这样的需求那就 ...
- Zookeeper集群服务部署
Zookeeper是一个分布式.开源的分布式应用程序协调服务,是Google的Chubby的开源实现,也是和Hadoop.Hbase相互配合的重要组件,作用就是为分布式应用程序提供一致性服务,包括配置 ...
- ZipArchive和SSZipArchive使用详解
一.SSZipArchive 1.简介 SSZipArchive是iOS和Mac上一个简单实用的压缩和解压插件.用途包括:1.解压zip文件:2.解压密码保护的ZIP文件:3.创建新的zip文件:4. ...
- C#字符串的四舍五入
Round(Decimal) Round(Double) Round(Decimal, Int32) Round(Decimal, MidpointRounding) Round(Double, In ...
- 【linux】sudo su切换到root权限
在用户有sudo权限但不知道root密码时可用 sudo su切换到root用户
- 【python】lxml中多个xml采用相同节点时出现的问题
今天突然发现了一个lxml的坑. 假设我们有一个节点 <id>123</id> 有两个父节点都要用上述节点,则必须把上面的节点写两遍!用同一个会出错! 出错例子: #!/usr ...
- HDU 5821 Ball (贪心排序) -2016杭电多校联合第8场
题目:传送门. 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组. 题 ...