码农题..

很显然除了两个全局操作都能用可并堆完成

全局最大值用个multiset记录,每次合并时搞一搞就行了

注意使用multiset删除元素时

如果直接delete一个值,会把和这个值相同的所有元素全都删掉

如果find一个值得到一个迭代器,然后删除这个迭代器,就能只删除相同元素中的一个啦

因为这个调了1h..

 #include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 300010
using namespace std;
const int inf=0x3f3f3f3f; template <typename _T> void read(_T &ret)
{
ret=; _T fh=; char c=getchar();
while(c<''||c>''){ if(c=='-') fh=-; c=getchar(); }
while(c>=''&&c<=''){ ret=ret*+c-''; c=getchar(); }
ret=ret*fh;
}
struct node{
int x;
node(int x):x(x){} node(){}
friend bool operator < (const node &s1,const node &s2)
{ return s1.x>s2.x; }
};
multiset<node>s; struct Heap{
#define ls ch[x][0]
#define rs ch[x][1]
int fa[N1],ch[N1][],h[N1],val[N1],tag[N1],stk[N1],tp;
int idf(int x){ return ch[fa[x]][]==x?:; }
void pushdown(int x)
{
if(!tag[x]) return;
val[ls]+=tag[x]; val[rs]+=tag[x];
tag[ls]+=tag[x]; tag[rs]+=tag[x];
tag[x]=;
}
int merge(int x,int y)
{
if(!x||!y) return x+y;
if(val[x]<val[y]) swap(x,y);
pushdown(x);
ch[x][]=merge(ch[x][],y);
fa[ch[x][]]=x;
if(h[ch[x][]]<h[ch[x][]])
swap(ch[x][],ch[x][]);
h[x]=h[ch[x][]]+;
return x;
}
int findfa1(int x)
{
tp=; stk[++tp]=x;
while(fa[x]) stk[++tp]=fa[x], x=fa[x];
while(tp) pushdown(stk[tp--]);
return x;
}
int findfa2(int x)
{
while(fa[x]) x=fa[x];
return x;
}
void uni(int x,int y)
{
x=findfa2(x), y=findfa2(y); if(x==y) return;
s.erase(node(val[x])), s.erase(node(val[y]));
x=merge(x,y); s.insert(node(val[x]));
}
void addx(int x,int w)
{
int y=findfa1(x),z; s.erase(node(val[y])); tp=;
fa[ls]=fa[rs]=; z=merge(ls,rs); ls=rs=;
ch[fa[x]][idf(x)]=; fa[x]=; val[x]+=w;
z=merge(x,z); if(y!=x) z=merge(y,z);
s.insert(node(val[z]));
}
void addsome(int x,int w)
{
int y=findfa2(x);
s.erase(node(val[y]));
val[y]+=w; tag[y]+=w;
s.insert(node(val[y]));
}
int queryx(int x)
{
findfa1(x);
return val[x];
}
int querymax(int x)
{
x=findfa2(x);
return val[x];
}
#undef ls
#undef rs
}h;
int n,Q,de; int main()
{
scanf("%d",&n);
int i,tot=,x,y,cntf=; char str[];
for(i=;i<=n;i++) read(h.val[i]), s.insert(node(h.val[i]));
scanf("%d",&Q);
for(i=;i<=Q;i++)
{
scanf("%s",str);
if(str[]=='U') read(x), read(y), h.uni(x,y);
if(str[]=='A')
{
switch(str[])
{
case '': read(x), read(y); h.addx(x,y); break;
case '': read(x), read(y), h.addsome(x,y); break;
case '': read(y), tot+=y; break;
}
}
if(str[]=='F')
{
cntf++;
if(cntf==)
de=;
switch(str[])
{
case '': read(x), printf("%d\n",h.queryx(x)+tot); break;
case '': read(x), printf("%d\n",h.querymax(x)+tot); break;
case '': printf("%d\n",(*s.begin()).x+tot);
}
}
}
return ;
}

BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)的更多相关文章

  1. BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...

  2. bzoj 2333 [SCOI2011]棘手的操作 —— 可并堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2333 稍微复杂,参考了博客:http://hzwer.com/5780.html 用 set ...

  3. BZOJ 2333: [SCOI2011]棘手的操作

    题目描述 真的是个很棘手的操作.. 注意每删除一个点,就需要clear一次. #include<complex> #include<cstdio> using namespac ...

  4. BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...

  5. 2333: [SCOI2011]棘手的操作[写不出来]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1979  Solved: 772[Submit][Stat ...

  6. 2333: [SCOI2011]棘手的操作[离线线段树]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2325  Solved: 909[Submit][Stat ...

  7. 2333: [SCOI2011]棘手的操作[我不玩了]

    2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1979  Solved: 772[Submit][Stat ...

  8. 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记

    2016-05-31  21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...

  9. 【BZOJ】2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 题意: 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i], ...

随机推荐

  1. UVA 10187 From Dusk Till Dawn /PC 110907

    不吐槽.. #include <iostream> #include <map> #include <queue> //无语的水题.节哀吧.且这道题不严谨,因为没说 ...

  2. Light oj 1251 - Forming the Council 【2-sat】【推断是否存在可行解 + 反向拓扑输出可行解】

    1251 - Forming the Council problem=1251" style="color:rgb(79,107,114)"> PDF (Engli ...

  3. Xcode6+Cocos2d-x真机调试 报错

    眼下真机调试时遇到下面问题. Undefined symbols for architecture arm64: "_png_get_io_ptr", referenced fro ...

  4. &#39;hibernate.dialect&#39; must be set when no Connection available

    今天碰到的这个问题,非常无厘头.网上搜索了非常多.都不靠谱,还是靠自己 解决方法是在hibernate.cfg.xml中加入 <property name="dialect" ...

  5. Cache 总结

    这一文,让我们分析一下,<浅谈 Cache> 一文中的奇怪现象,事实上如今来看也并不奇怪了.         在什么情况下 r1 和 r2 都为 0 呢?         细致看代码,你会 ...

  6. usb键鼠驱动分析【钻】

    本文转载自:http://blog.csdn.net/orz415678659/article/details/9197859 一.鼠标 Linux下的usb鼠标驱动在/drivers/hid/usb ...

  7. Adding a model

    https://docs.asp.net/en/latest/tutorials/first-mvc-app/adding-model.html Adding data model classes I ...

  8. 【BZOJ 2351】 Matrix

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2351 [算法] 哈希 [代码] #include<bits/stdc++.h& ...

  9. POJ 1654 乱搞题?

    题意: 从一个点出发,8个方向,给出每一步的方向,求出走过的路径形成的多边形的面积. 思路: 先普及一下向量叉乘.. (摘自度娘) 也就是x1y2-x2y1. 那这不就好说了嘛. 一个经过原点的闭合多 ...

  10. 几道leetcode不会做的题目

    1.set没有back()函数,今天想到用这个,才发现没有. 2. tuple的initialize_list construct好像不能使用,其实之前没使用过tuple,都是pair,复杂一点的自己 ...