码农题..

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

全局最大值用个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 ;
}

最新文章

  1. 前端开发week3
  2. 大数据处理时用到maven的repository
  3. SPOJ SUBST1 后缀数组
  4. linux应用于发展(下)
  5. python内置函数 2
  6. magento性能优化
  7. Contest 20140923 登月计划 BabyStepGaintStep
  8. treeview右键添加新节点
  9. 多线程编程中使用pthread_create内存泄露问题
  10. static 控件颜色修改
  11. reactor与proactor模式
  12. 【zzulioj 2127】 tmk射气球
  13. NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&amp;python实现、相关应用)
  14. 精彩源于起点——2018年潍坊市首次青少年Python编程公开课
  15. partial 的随笔
  16. css清除默认样式,stylus学习
  17. mobile_基础事件
  18. C#-泛型类型(十六)
  19. [python]PyPI使用国内源
  20. Ocelot中文文档-Getting Started

热门文章

  1. C#带cookie模拟登录百度
  2. With Storm Spouts, when is declareOutputFields( ) called?
  3. keil uV4一个project内各个后缀名文件的作用
  4. php抓取网页
  5. 【移动开发】布局优化利器&amp;lt;include/&amp;gt;和ViewStub
  6. 搜索分析(DFS、BFS、递归、记忆化搜索)
  7. raspberry-常用命令
  8. 将python的程序包装成windows下的service
  9. Redis(一)、Redis五种数据结构
  10. ES6 Proxy 性能之我见