BZOJ 2333 左偏树 (写得我人生都崩溃了...)
思路:
高一神犇 竟然 问我这道题 我光荣地 看着题解(划掉) 写了一下午 QaQ
multiset不能erase(一个值) 这样就把等于这个值 的数都erase掉了 (woc我一开始不知道啊啊啊 )
注意细节...
//By SiriusRen
#include <set>
#include <cstdio>
using namespace std;
const int N=;
int n,q,all,xx,yy;
char op[];
struct Tree{int w,l,r,fa,dis,lazy;}tr[N];
int find(int x){while(tr[x].fa)x=tr[x].fa;return x;}
void push_down(int x){
if(tr[x].l)tr[tr[x].l].w+=tr[x].lazy,tr[tr[x].l].lazy+=tr[x].lazy;
if(tr[x].r)tr[tr[x].r].w+=tr[x].lazy,tr[tr[x].r].lazy+=tr[x].lazy;
tr[x].lazy=;
}
int merge(int x,int y){
if(x*y==)return x+y;
if(tr[x].w<tr[y].w)swap(x,y);
push_down(x);
tr[x].r=merge(tr[x].r,y);
tr[tr[x].r].fa=x;
if(tr[tr[x].l].dis<tr[tr[x].r].dis)swap(tr[x].l,tr[x].r);
tr[x].dis=tr[tr[x].r].dis+;
return x;
}
int del(int x){
int F=tr[x].fa,t;
push_down(x);tr[t=merge(tr[x].l,tr[x].r)].fa=F;
tr[x].l=tr[x].r=tr[x].fa=tr[x].dis=;
if(tr[F].l==x)tr[F].l=t;
else tr[F].r=t;
while(tr[t].fa)t=tr[t].fa;
return find(t);
}
void dfs(int x){
if(tr[x].fa)dfs(tr[x].fa);
push_down(x);
}
multiset<int>s;multiset<int>::iterator it;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&tr[i].w),s.insert(tr[i].w);
scanf("%d",&q);
for(int I=;I<=q;I++){
scanf("%s",op);
if(op[]=='A'){
if(op[]==''){
scanf("%d%d",&xx,&yy);
dfs(xx);
s.erase(s.find(tr[find(xx)].w));
tr[xx].w+=yy;
s.insert(tr[merge(del(xx),xx)].w);
}
else if(op[]==''){
scanf("%d%d",&xx,&yy);
int fx=find(xx);
s.erase(s.find(tr[fx].w));
tr[fx].w+=yy,tr[fx].lazy+=yy;
s.insert(tr[fx].w);
}
else if(op[]=='')scanf("%d",&xx),all+=xx;
}
else if(op[]=='F'){
if(op[]==''){
scanf("%d",&xx);dfs(xx);
printf("%d\n",tr[xx].w+all);
}
else if(op[]==''){
scanf("%d",&xx);
printf("%d\n",tr[find(xx)].w+all);
}
else if(op[]==''){
it=s.end();it--;
printf("%d\n",(*it)+all);
}
}
else{
scanf("%d%d",&xx,&yy);
int fx=find(xx),fy=find(yy);
if(fx!=fy){
if(merge(fx,fy)==fy)s.erase(s.find(tr[fx].w));
else s.erase(s.find(tr[fy].w));
}
}
}
}
BZOJ 2333 左偏树 (写得我人生都崩溃了...)的更多相关文章
- bzoj 2809 左偏树\平衡树启发式合并
首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...
- BZOJ 4003 左偏树
思路: 用到了左偏树合并复杂度是logn的性质 一开始先BFS一遍 打标记的左偏树 //By SiriusRen #include <cstdio> #include <cstrin ...
- 题解 P3377 【【模板】左偏树(可并堆)】
所谓的左偏树,是一种可并堆的实现. 这种数据结构能够支持高效的堆合并,但是不支持查询节点等操作,因此不同于平衡树,它的结构是不平衡的. 左偏树满足如下两条基本性质: 1. 堆的性质 这也就是说左偏树每 ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
- bzoj 1455: 罗马游戏 左偏树+并查集
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 668 Solved: 247[Submit][Status] Descriptio ...
- 【BZOJ 2809】2809: [Apio2012]dispatching (左偏树)
2809: [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Maste ...
- bzoj 4585: [Apio2016]烟火表演【左偏树】
参考:https://blog.csdn.net/wxh010910/article/details/55806735 以下课件,可并堆部分写的左偏树 #include<iostream> ...
- BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)
题意 略 分析 稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有 ...
- BZOJ 1455 罗马游戏 ——左偏树
[题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...
随机推荐
- 结果缓冲区 resbuf具体用法
struct resbuf *rb; rb=acutBulidlist(RTSTR,text(), rtpoint,,,,,) 创建圆用法. acdbEntGet 返回结果缓冲区 然后 rb-> ...
- 数据库操作(二)SOQL
1.SOQL SOQL是对象查询语言.它可以在单个sObject中在给定标准上搜索记录. 2.SELECT语句 [格式]SELECT 列名称 FROM 表名称 [示例] 3.SELECT...WHER ...
- Sersync+Rsync实现数据文件实时同步
rsync+inotify-tools与rsync+sersync架构的区别1,rsync+inotify-tools只能记录下被监听的目录发生的变化(增删改)并没有把具体变化的文件或目录记录下来在同 ...
- php第十八节课
PDO 对不同的数据库连接使用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- JS布尔值(Boolean)转换规则
原文作者: louis 原文链接: http://louiszhai.github.io/2015/12/11/js.boolean/ 语法 众所周知, JavaScript有五个基本的值类型:num ...
- isset在php5.6-和php7.0+的一些差异
今天在公司实现一个模块功能时写了如下代码: class ProductCategory { const TYPES = [ 1 => 'type1', 2 => 'type2', ]; p ...
- 清北学堂模拟赛d4t4 a
分析:感觉和dp的状态转移方式有点类似,对于一个数,你不能看有多少个状态能转移到它,你要看它能转移到多少个状态,相当于刷表法和填表法的区别,对于这道题也是一样,我们不能看有多少个数是x的倍数,而是每次 ...
- Fedora15下安装Android开发环境
Fedora15下安装Android开发环境需要以下步骤: 完整步骤. 1. 安装正确版本的JDK. 2. 安装Eclipse. 3. 安装ADT. 4. 安装Android SDK. 5. 安 ...
- 使用JQUERY的flexselect插件来实现将SELECT下拉菜单变成自动补全输入框
这也是下拉列表太长了之后,使用的同事提出来的意见, 然后,本来开始想将DJANGO的那个后台下拉菜单移植过来的,但发现不现实,也麻烦, 就找了几个JQUERY的插件测试了一下,最后选中了flexsel ...
- Groovy简单再入门
以前试过,忘得差不多了,趁这次从JAVA一直撸到SERVLET,SPRING,GROOVY,GRAILS的机会,再弄一次吧... def authors = [ "Peter Ledbroo ...