[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: 加一条边 ...
随机推荐
- express中cookie的使用和cookie-parser的解读
https://segmentfault.com/a/1190000004139342?_ea=504710 最近在研究express,学着使用cookie,开始不会用,就百度了一下,没有百度到特别完 ...
- 本地测试出现:Call to undefined function curl_init()
网上搜索Call to undefined function curl_init(),清一色的以下解决办法: 1.在php.ini中找到extension=php_curl.dll,去掉前面的,php ...
- 【WIP】markdown
创建: 2018/03/18 [任务表]TODO 这个博客从来不点发布到首页, 完全100%自用, 全部详细完整的干货.千辛万苦找到这里看到一片空白, 是不是很愤怒? 那就对啦233333
- bzoj 1306: [CQOI2009]match循环赛【dfs+剪枝】
大力剪枝,最后洛谷上还开了o2才过-- 大概这样剪枝: 1.搜索中,一个队当前得分超过要求或者一个队剩下的比赛场数全赢也达不到要求则return: 2.注意到如果平局,最总分的贡献是2,否则是3,所以 ...
- 暴力/进制转换 Codeforces Round #308 (Div. 2) C. Vanya and Scales
题目传送门 /* 题意:问是否能用质量为w^0,w^1,...,w^100的砝码各1个称出重量m,砝码放左边或在右边 暴力/进制转换:假设可以称出,用w进制表示,每一位是0,1,w-1.w-1表示砝码 ...
- 题解报告:hdu1995汉诺塔V(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 Problem Description 用1,2,...,n表示n个盘子,称为1号盘,2号盘,. ...
- 题解报告:hdu1202The calculation of GPA(算绩点问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1202 Problem Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对 ...
- Android开发学习——Volley框架
转载至: http://blog.csdn.net/guolin_blog/article/details/17482095 一些概念性的东西 大家进入上边链接理解,我贴一下 具体的实现代码: pub ...
- 不重启IIS修改dotnet framework版本
因为公司现在存在.net站点和asp站点共同运行的情况,所以需要对IIS进行一些修改,运行环境Win2003+IIS6 一.起因 原来的老站是asp开发的,用的是.net 2.0运行环境; 新站是.n ...
- 如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret。
如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret. 申请流程如下: 步骤1:登陆腾讯开放平台.链接地址: http://open.qq.com/ . 步骤2:填 ...