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+20, M = 4e4+10, mod = 1e9+7, inf = 0x3f3f3f3f;int c[N][2],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][0], r = c[k][1];sum[k] = sum[l] + sum[r] + v[k];size[k] = size[l] + size[r] + 1; } inline void push_down(int k) {int l = c[k][0], r = c[k][1], t = tag[k];if(t) {tag[k] = 0;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][0] == x) l=0;else l=1;r=l^1;if(y == k) k = x;else {if(c[z][0] == y) c[z][0] = x;else c[z][1] = 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][0] == x ^ c[z][0] == y) rotate(x,k);else rotate(y,k);}rotate(x,k);} }inline void ask_befor(int k,int x) {push_down(k);if(k==0)return;if(ID[k]<=x){t1=k;ask_befor(c[k][1],x);}else ask_befor(c[k][0],x);} inline void ask_after(int k,int x) {push_down(k);if(k==0)return;if(ID[k]>=x){t2=k;ask_after(c[k][0],x);}else ask_after(c[k][1],x); } inline void update(int l,int r,int val) {ask_befor(rt,l-1),ask_after(rt,r+1);int x = t1, y = t2;splay(x,rt);splay(y,c[x][1]);int z = c[y][0];tag[z] += val;v[z] += val;sum[z] +=1LL*val*size[z]; }inline void query(int l,int r) {ask_befor(rt,l-1), ask_after(rt,r+1);int x = t1, y = t2;splay(x,rt),splay(y,c[x][1]);int z = c[y][0];printf("%lld\n",sum[z]); } inline void ins(int &k,int ids,int val,int last) {push_down(k);if(k == 0) {++sz;size[sz]=1;k = sz;v[k] = val;sum[k] = val;fa[k] = last;ID[k] = ids;return ;}if(ids < ID[k]) ins(c[k][0],ids,val,k);else ins(c[k][1],ids,val,k);push_up(k); } inline void Delet(int l,int r) {ask_befor(rt,l-1), ask_after(rt,r+1);int x = t1, y = t2;splay(x,rt),splay(y,c[x][1]);c[y][0] = 0; } int main() {sz = 0;ins(rt,-1,0,0);ins(rt,100000001,0,rt);scanf("%d",&n);while(n--){char ch[3];int l,r,val;scanf("%s%d%d",ch,&l,&r);if(ch[0] == 'I') {ins(rt,l,r,rt);splay(sz,rt);} else if(ch[0] == 'Q') {query(l,r);} else if(ch[0] == 'M') {scanf("%d",&val);update(l,r,val);} else if(ch[0] == 'D') {Delet(l,r);}}return 0; }
转载于:https://www.cnblogs.com/zxhl/p/5854174.html
hihocoder #1333 : 平衡树·Splay2相关推荐
- hihocoder #1329 : 平衡树·Splay
#1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...
- 【Splay】文艺平衡树(金牌导航 Splay-2)
#文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列 输入样例 5 3 1 3 1 3 1 4 输出样例 4 3 2 1 5 数据范围 ...
- 简析平衡树(三)——浅谈Splay
前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...
- CF702F T-Shirts (排序+平衡树)
题意: 有nnn种 T 恤,每种有价格 cic_ici 和品质 qiq_iqi. 有 mmm 个人要买 T 恤,第 iii 个人有 viv_ivi 元,每人每次都会买一件能买得起的 qiq_i ...
- 2019 ICPC 南昌 K. Tree(树上启发式合并,平衡树 treap)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://nanti.jisuanke.com/t/42586 Problem 给定一 ...
- C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)
整理的算法模板合集: ACM模板 目录 一.平衡树 例题:luogu P3369 [模板]普通平衡树 1. `rb_tree_tag`版 2. `splay_tree_tag`版 功能不够?自己添加! ...
- c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)
整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...
- luogu P4847 银河英雄传说V2(FHQ - 平衡树)
初始情况下我们有 n 颗大小为 1的平衡树,合并就正常合并,分裂就正常分裂,但我们需要注意的是合并的标记值所在的序列而非标记值所在的元素,所以一个序列的代表就是它的根节点,我们不需要记录它,记录了反而 ...
- luogu P3391 【模板】文艺平衡树(FHQ - treap,懒惰标记)
整理的算法模板合集: ACM模板 我们把每个查询区间使用solit分裂成[1l−1][lr][r+1n][1~l-1][l~r][r+1~n][1 l−1][l r][r+1 n]三个区间. 再把[l ...
最新文章
- 【云快讯】之四十五《Google在云服务领域认输?不,我们的重点是大数据》
- ArrayList构造方法详解-给默认长度的方式
- BugKuCTF 杂项 啊哒
- Spring 2.x AOP 配置方式整理
- 谈大数据也谈人工智能 郭为告诉你一个不一样的神州控股
- C和汇编混合编程----printf
- php阴影效果,如何使用css3实现文字的单阴影效果和多重阴影效果(
- vue生成静态html文件_vue单文件组件,如何生成.html文件
- 读Cookie安全后的读后感
- 易混单词 expect VS except
- 统计学基本概念(及辨异)
- Codeforces 893 D Credit Card 贪心 思维
- 如何下载央视网视频,下载视频播放花屏怎么办
- 电子计算机的五个部分组成,电子计算机由哪几大部分构成?
- DataWhale第21期组队学习自然语言处理实践(知识图谱)task4— 用户输入->知识库的查询语句
- RabbitMQ笔记
- 关于手册的页码和有效页清单 - LEP
- 微信小程序入门实例--地图
- playcanvas 引擎
- window.onload的用法