BZOJ 2333: [SCOI2011]棘手的操作
真的是个很棘手的操作。。
注意每删除一个点,就需要clear一次。
#include<complex>
#include<cstdio>
using namespace std;
const int N=3e5+;
int n,m,rot,add;
//add记录所有节点增加的权值
int q[N<<];
inline int qread()
{
int x=,j=;
char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')j=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*j;
}
struct Leftist
{
int fat[N],son[N][],key[N],dis[N],mark[N];
void clear(int x)
{
fat[x]=son[x][]=son[x][]=;
}
void PushDown(int x)
{
if(!mark[x])return;
if(son[x][])
{
key[son[x][]]+=mark[x];
mark[son[x][]]+=mark[x];
}
if(son[x][])
{
key[son[x][]]+=mark[x];
mark[son[x][]]+=mark[x];
}
mark[x]=;
}
int Merge(int a,int b)
{
if(!a || !b)return a+b;
if(key[a]<key[b])swap(a,b);
PushDown(a);
son[a][]=Merge(son[a][],b);
fat[son[a][]]=a;
if(dis[son[a][]]>dis[son[a][]])swap(son[a][],son[a][]);
dis[a]=dis[son[a][]]+;
return a;
}
int Sum(int x)
{
int res=;
while(x=fat[x])res+=mark[x];
return res;
}
int Top(int x)
{
while(fat[x])x=fat[x];
return x;
}
int Pop(int x)
{
PushDown(x);
int q=fat[x],p=Merge(son[x][],son[x][]);
if(q)son[q][son[q][]==x]=p;
fat[p]=q;
while(q)
{
if(dis[son[q][]]>dis[son[q][]])
swap(son[q][],son[q][]);
if(dis[q]==dis[son[q][]]+)return rot;
dis[q]=dis[son[q][]]+;
p=q;q=fat[q];
}
return p;
}
int AddPoint(int x,int v)
{
int t=Top(x);
if(t==x)
if(!son[x][] && !son[x][])
{
key[x]+=v;
return x;
}
else
if(son[x][])t=son[x][];
else t=son[x][];
Pop(x);
key[x]+=v+Sum(x);
clear(x);
return Merge(Top(t),x);
}
int Build()
{
int head=,tail=;
for(int i=;i<=n;i++)
q[++tail]=i;
int x,y;
while(tail-head)
{
x=q[head++];y=q[head++];
q[++tail]=Merge(x,y);
}
return q[head];
}
}t1,t2;
//对于F3操作,需要把所有堆的根拿出来建一个新的堆
//新开一棵t2来维护这些点
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
t1.key[i]=t2.key[i]=qread();
rot=t2.Build();
char c[];int x,y,r1,r2;
scanf("%d",&m);
while(m--)
{
scanf("%s",c);
if(c[]=='U')
{
x=qread();y=qread();
r1=t1.Top(x);r2=t1.Top(y);
if(r1!=r2)
{
int tmp=t1.Merge(r1,r2);
if(tmp==r1)t2.Pop(r2);
else t2.Pop(r1);
/*
合并时,若树a并到了b上,则将a从第二棵树中删除,反之则删除b
被删去的点还是可能会成为最大值的,可它已经被删除了....
它再次成为最大值只有可能是在A1操作,将它再插入就好了
*/
}
}
else if(c[]=='A' && c[]=='')
{
x=qread();y=qread();
rot=t2.Pop(t1.Top(x));
int tmp=t1.AddPoint(x,y);
t2.key[tmp]=t1.key[tmp];
t2.clear(tmp);
rot=t2.Merge(rot,tmp);
}
else if(c[]=='A' && c[]=='')
{
x=qread();y=qread();
r1=t1.Top(x);
rot=t2.Pop(r1);
//整个联通块都+y,不影响堆的性质,但mark不能及时下传,所以仍要把根删去后再插入
t1.key[r1]+=y;t1.mark[r1]+=y;
t2.key[r1]=t1.key[r1];
t2.clear(r1);
rot=t2.Merge(r1,rot);
}
else if(c[]=='A' && c[]=='')add+=qread();
else if(c[]=='F' && c[]=='')
{
x=qread();
printf("%d\n",t1.key[x]+add+t1.Sum(x));
}
else if(c[]=='F' && c[]=='')
{
x=qread();
printf("%d\n",t1.key[t1.Top(x)]+add);
}
else printf("%d\n",t2.key[rot]+add);
}
return ;
}
BZOJ 2333: [SCOI2011]棘手的操作的更多相关文章
- BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...
- BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...
- bzoj 2333 [SCOI2011]棘手的操作 —— 可并堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2333 稍微复杂,参考了博客:http://hzwer.com/5780.html 用 set ...
- BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)
码农题.. 很显然除了两个全局操作都能用可并堆完成 全局最大值用个multiset记录,每次合并时搞一搞就行了 注意使用multiset删除元素时 如果直接delete一个值,会把和这个值相同的所有元 ...
- 2333: [SCOI2011]棘手的操作[写不出来]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1979 Solved: 772[Submit][Stat ...
- 2333: [SCOI2011]棘手的操作[离线线段树]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2325 Solved: 909[Submit][Stat ...
- 2333: [SCOI2011]棘手的操作[我不玩了]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1979 Solved: 772[Submit][Stat ...
- 【BZOJ】2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 题意: 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i], ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
随机推荐
- 在右键菜单中添加用Jupyter Notebook打开
在右键菜单中添加用Jupyter Notebook打开 为了把 Jupyter 的工作目录指定到某一个文件夹下,每次都要启动 CMD 终端, 然后激活 Anaconda 环境,再启动 Jupyter ...
- activiti串行会签的使用
1.串行任务的配置 2.当任务走到串行会签节点时,会从你之前保存的流程变量中找集合(我这里设置的assigneeList),串行会签会根据这个集合设置一系列该节点的流程变量 3.结束条件的设置,若满足 ...
- 8 search中的timeout参数
默认的search,是没有时间限制的.比如,一个search,可能要10分钟才能搜完,那么,es就会等10分钟,直到结果出来. 然而,在某些场景下,客户是等不了10分钟的.比如,电商网站,客户宁可 ...
- 1 集群状态、增删改查、全量替换、强制创建、设置单个index的分片数副本数
检查集群健康状态,可以看集群颜色.(黄色:primary shard都正常,replica不正常) GET /_cat/health?v 列出集群所有index GET /_cat/indices?v ...
- 【转载】ASP.NET网站选购阿里云服务器的时候,阿里云账号个人认证以及企业认证有何不同
在采购阿里云产品,如阿里云云服务器.阿里云短信包.阿里云数据库MySql以及Sqlserver.阿里云对象存储OSS等云产品的时候,如果账号未进行实名认证,很多时候会要求实名认证操作,在实名认证时可选 ...
- CPU子系统
CPU的基本结构: CPU的主要部件: 运算部件.缓存部件.寄存器.控制器.时序部件 CPU的工作原理: 主要功能:处理指令.执行操作.控制时间.数据运算 执行指令的流程:读取指令.指令译 ...
- JS中回调函数的简单用法
a能拿b,b能拿到c,c能拿到d,实现a拿到d的东西. function a() { b(function (data) { console.log(data); }); } function b(c ...
- MySQL5.7.16安装及配置
一.下载 下载页面http://dev.mysql.com/downloads/mysql/ 选择系统平台后,点击download(根据系统选择64或32位) 二.配置 1.下载成功后,解压安装包到要 ...
- Flask初识之安装及HelloWord程序
Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用 ...
- ECSHOP(3.0.0升级3.6.0)帮助教程
说明: 本文档只针对于未做过二开的ECSHOP3.0 用户 1.准备材料 先确保正在使用的ECShop系统版本为ecshop3.0.0并且代码没有经过二次开发,然后下载最新的ECShop3.6.0安装 ...