码农题..

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

全局最大值用个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. [bzoj1090][SCOI2003]字符串折叠_区间dp

    字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...

  2. MyBatis中sqlSession操作数据库,不报错但无法实现数据修改(增、改、删)

    public void addCustomerTest() throws Exception { SqlSession sqlSession = MyBatisUtils.getSession(); ...

  3. POJ2689 Prime Distance 质数筛选

    题目大意 求区间[L, R]中距离最大和最小的两对相邻质数.R<2^31, R-L<1e6. 总体思路 本题数据很大.求sqrt(R)的所有质数,用这些质数乘以j, j+1, j+2... ...

  4. jquery事件重复绑定的几种解决方法

    防止事件重复绑定共有4种方法: bind().unbind()方法 live().die()方法 off().on()方法 one()方法 一.bind().unbind()方法 bind();绑定事 ...

  5. 实体类中方法名尽量避免set,get,报错com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException)

    自己建了一个实体类 public class MissPoint implements Serializable{ private static final long serialVersionUID ...

  6. kubernetes系列

    目录: 介绍的全部可以在github上找到,链接  haoprogrammer kubernetes学习:(一).kubeadm搭建kubernetes(v1.13.1)单节点集群 kubernete ...

  7. 部署hexo后github pages页面未更新或无法打开问题

    title: 部署hexo后github pages页面未更新或无法打开问题 date: 2018-03-30 15:34:29 categories: methods tags: hexo gith ...

  8. JS实时获取浏览器窗口尺寸 .

    给div实时设置宽度 <div id="detail" style="width: 100%; overflow: scroll;"> </d ...

  9. 2.TinkPHP入门----控制器

    1.控制器创建 命名规则:控制器名称+Controller+.class.php, 例如GoodsController.class.php  UserController.class.php 控制器结 ...

  10. cropper+pillow处理上传图片剪裁(一)

    在写新博客的时候,遇到需要用户上传自定义图片的处理,查了一番资料,决定用cropper和pillow来处理需要剪裁的图片上传,大致思路是:前端收集用户上传的图片和用户剪裁的尺寸数据,后台接收图片后按数 ...