码农题..

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

全局最大值用个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. 0606关于mysql优化原理

    转自 http://blog.csdn.net/u012388497/article/details/25097159 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准 ...

  2. ASP内置对象—Request、Response 、Server、Application 、ObjectContent (二)

    Response (应答)对象 Request 对象.用于在HTTP请求期间,訪问不论什么client浏览器传递给server的信息,包含通过URL传递的參数信息.使用GET方法或POST方法传递的H ...

  3. Chrome改动浏览器User Agent

    对浏览器快捷方式右键->改动目标项为 C:\Users\LJ\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent=&q ...

  4. Java类集综合练习——信息管理(增、删、改、查)

    一.实现功能——模拟学生选课功能 1.选择课程 2.修改所选课程 二.实现功能——模拟学生信息管理功能 1.添加学生信息 2.修改学生信息 二.主要代码(在同一个包里) 1.课程类 public cl ...

  5. h5-10 canvas 简易祖玛

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. vim插件系列

    http://foocoder.com/blog/mei-ri-vimcha-jian-ping-hua-gun-dong-accelerated-smooth-scroll-dot-vim.html ...

  7. 字符串函数---strcmp()与strncmp()详解及实现【转】

    本文转载自:http://blog.csdn.net/lanzhihui_10086/article/details/39829623 一.strcmp()与strncmp() strcmp():st ...

  8. new一个接口

    首先我们先看看接口的定义: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方 ...

  9. 一个php+jquery+json+ajax实例

    json.php <!DOCTYPE html Public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  10. 【BZOJ1565】【NOI2009】植物大战僵尸

    好久没写博客了 题目 题目在这里 思路&做法 没什么好说的 应该很容易看出是 最大闭合子图 吧? 不过要注意一下的是,这题 可能有植物是不可能被击溃的 , 所以要先跑一遍 拓扑排序 把这些点排 ...