[SCOI2011]棘手的操作(可并堆/并查集/线段树)
过于棘手
但这题真的很水的说
毕竟写啥都能过
常见思路:
①:由于不强制在线,所以重新编号之后线段树维护
②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的
讲一种无脑算法:
对于$F1$,并查集乱搞
对于$F2$,用可并堆维护连通块里的值,并维护对应的时间,如果堆顶访问到旧的值直接抛出
对于$F3$,用全局堆维护每个连通块的最大值的集合并维护对应的时间,如果堆顶访问到旧的值直接抛出
$A1$:单点修改时在所在可并堆里插入一个新的,维护修改时间,同时在全局堆里插入一个新的该可并堆的最大值
$A2$:在堆上打tag,在全局堆中插入新的最大值
$A3$:维护一个全局变量
$U$:略
好气啊将近二百行可并堆写的一点问题没有结果十多行并查集出了三处锅...
#include<cstdio>
#include<queue>
#include<algorithm>
using std::max;
using std::priority_queue;
using std::swap;
;
int n,v[N],del[N],Del;
];
int lta[N],ltb[N];
struct shino
{
int id,v,t;
shino(){}
shino(int a,int b,int c){id=a,v=b,t=c;}
bool friend operator < (shino x,shino y){return x.v<y.v;}
}g;
struct merheap
{
],tag[N<<],son[N<<][],fa[N<<],kr,yop[N<<],rt[N<<];
shino el[N<<];
int find(int x)
{
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
void fuckdown(int x)
{
if(tag[x])
{
];
if(k){el[k].v+=tag[x];tag[k]+=tag[x];}
k=son[x][];
if(k){el[k].v+=tag[x];tag[k]+=tag[x];}
tag[x]=;
}
}
int makenew(shino sn)
{
kr++;
el[kr]=sn;
fa[kr]=kr;
return kr;
}
int merge(int x,int y)
{
if(!x) return y;
if(!y) return x;
fuckdown(x);
fuckdown(y);
if(el[x]<el[y]) swap(x,y);
son[x][]=merge(son[x][],y);
fa[son[x][]]=x;
]]<dis[son[x][]]) swap(son[x][],son[x][]);
dis[x]=dis[son[x][]]+;
return x;
}
void push(int x,shino ei)
{
int tmp=makenew(ei);
int xx=find(x);
rt[x]=merge(xx,tmp);
}
void pop(int x)
{
int xx=find(x);
fuckdown(xx);
],son[xx][]);
fa[xx]=tmp;
]) fa[son[xx][]]=tmp;
]) fa[son[xx][]]=tmp;
rt[x]=tmp;
}
shino top(int x)
{
x=find(x);
return el[x];
}
void update(int x)
{
int xx=find(x);
while(xx)
{
xx=find(xx);
g=top(xx);
if(g.t!=lta[g.id]) pop(xx);
else break;
}
}
void add(int x,int vi)
{
int xx=find(x);
el[xx].v+=vi;
tag[xx]+=vi;
}
void init()
{
;i<=n;i++)
{
makenew(shino(i,v[i],));
rt[i]=i;
}
}
}rk;
int fa[N];
bool isrt[N];
void domerge(int x,int y);
priority_queue<shino> q;
void find(int x)
{
if(fa[x]!=fa[fa[x]]) find(fa[x]),v[x]+=del[fa[x]];
fa[x]=fa[fa[x]];
}
void merge(int x,int y,int tt)
{
find(x),find(y);
int fx=fa[x],fy=fa[y];
if(fx==fy) return;
domerge(fx,fy);
q.push(shino(fy,rk.top(fy).v,tt));
ltb[fy]=tt;
fa[fx]=fy;
del[fx]-=del[fy];
v[fx]+=del[fx];
isrt[fx]=;
}
void domerge(int x,int y)
{
int xx=rk.find(x),yy=rk.find(y);
int tmp=rk.merge(xx,yy);
rk.fa[xx]=rk.fa[yy]=rk.rt[y]=tmp;
}
void fuckdate()
{
while(!q.empty())
{
g=q.top();
if(!isrt[g.id]||g.t!=ltb[g.id]) q.pop();
else break;
}
}
int main()
{
scanf("%d",&n);
;i<=n;i++) scanf(;
int T;
scanf("%d",&T);
rk.init();
;i<=n;i++) q.push(shino(i,v[i],));
int xin,yin,vin;
;t<=T;t++)
{
scanf("%s",op);
]=='U')
{
scanf("%d%d",&xin,&yin);
merge(xin,yin,t);
}]=='A')
{
]==')
{
scanf("%d%d",&xin,&vin);
find(xin);
v[xin]+=vin;
rk.push(fa[xin],shino(xin,v[xin]+del[fa[xin]],t));
lta[xin]=t;
rk.update(fa[xin]);
q.push(shino(fa[xin],rk.top(fa[xin]).v,t));
ltb[fa[xin]]=t;
}]==')
{
scanf("%d%d",&xin,&vin);
find(xin);
del[fa[xin]]+=vin;
rk.add(fa[xin],vin);
q.push(shino(fa[xin],rk.top(fa[xin]).v,t));
ltb[fa[xin]]=t;
}else
{
scanf("%d",&vin);
Del+=vin;
}
}]=='F')
{
]==')
{
scanf("%d",&xin);
find(xin);
printf("%d\n",v[xin]+del[fa[xin]]+Del);
}]==')
{
scanf("%d",&xin);
find(xin);
rk.update(fa[xin]);
printf("%d\n",rk.top(fa[xin]).v+Del);
}else
{
fuckdate();
g=q.top();
printf("%d\n",g.v+Del);
}
}
}
;
}
巨佬您txdy
题外话:你这题解也太水了吧
rkk:因为确实水死了啊...都快成板子了...
[SCOI2011]棘手的操作(可并堆/并查集/线段树)的更多相关文章
- 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记
2016-05-31 21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...
- BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...
- 【bzoj2333】[SCOI2011]棘手的操作 可并堆+STL-set
UPD:复杂度是fake的...大家还是去写启发式合并吧. 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条 ...
- [bzoj2333] [SCOI2011]棘手的操作 (可并堆)
//以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个节点,标号从1 ...
- BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)
码农题.. 很显然除了两个全局操作都能用可并堆完成 全局最大值用个multiset记录,每次合并时搞一搞就行了 注意使用multiset删除元素时 如果直接delete一个值,会把和这个值相同的所有元 ...
- bzoj 2333 [SCOI2011]棘手的操作 —— 可并堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2333 稍微复杂,参考了博客:http://hzwer.com/5780.html 用 set ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
- 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作
n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
随机推荐
- CCF 201409-1 相邻数对 (水题)
问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个整数,表示值正好 ...
- bzoj 4951: [Wf2017]Money for Nothing【分治】
参考:https://blog.csdn.net/herobrine_tkj/article/details/78404426?locationNum=8&fps=1 为什么从1开始存就挂了, ...
- WFS1.1.0协议(增删改查)+openlayers4.3.1前端构建+geoserver2.15.1安装部署+shpfile数据源配置
WFS简介 1.WFS即,Web要素服务,全称WebFeatureService.GIS下,支持对地理要素的插入,更新,删除,检索和发现服务. 2.属于OGC标准下的通信协议.OGC标准下的GIS服务 ...
- 微信支付接口调用问题(android正常,iphone调不起)
转自:http://blog.csdn.net/tt123123/article/details/53897035 碰到的问题 :根据微信提供的示例代码(ASP.NET),配置好一切后, 用andro ...
- IE兼容之中文汉字请求乱码-network
IE兼容之中文汉字请求乱码 IE控制台报错: IE网络报错: 解决方法: encodeURI('--- @ -- 子卿 -'); // "---%20@%20--%20%E5%AD%90%E ...
- 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...
- ROS学习笔记二:ROS系统架构及概念
本文主要是了解ROS的系统架构.文件夹结构以及工作所需的核心文件. ROS系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level).计算图级 ...
- [POI2007]四进制的天平Wag
Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...
- LightOj 1197 Help Hanzo (区间素数筛选)
题目大意: 给出T个实例,T<=200,给出[a,b]区间,问这个区间里面有多少个素数?(1 ≤ a ≤ b < 231, b - a ≤ 100000) 解题思路: 由于a,b的取值范围 ...
- 文件输入输出C++操作
基于C++的文件操作 在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 1.插入器(& ...