用set维护每个联通块里的最值,multiset维护所有块里的最值,并查集维护连通性,然后随便搞搞就行了,合并时候采用启发式合并。复杂度O(nlognlogn),大概勉强过的程度,反正跑的很慢就是了。

  代码

 #include<cstdio>
#include<set>
#define mp make_pair
#define fi first
#define sc second
using namespace std;
const int N = ;
int f[N],add[N],n,i,a[N],q,u,v,cnt;
set<pair<int,int> > s[N];
set<pair<int,int> >::iterator it;
multiset<int> S;
multiset<int>::iterator It;
char str[];
int gf(int x)
{
int p=x,t;
while (p!=f[p]) p=f[p];
while (x!=p)
{
t=f[x];f[x]=p;x=t;
}
return p;
}
int main()
{
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
f[i]=i;
s[i].insert(mp(a[i],i));
S.insert(a[i]);
}
scanf("%d",&q);
for (i=;i<=q;i++)
{
scanf("%s",str);
if (str[]=='F')
{
if (str[]=='')
{
scanf("%d",&u);
printf("%d\n",a[u]+add[gf(u)]+cnt);
}
else
if (str[]=='')
{
scanf("%d",&u);
printf("%d\n",(*(--s[gf(u)].end())).fi+add[gf(u)]+cnt);
}
else
printf("%d\n",*(--S.end())+cnt);
} if (str[]=='A')
{
if (str[]=='')
{
scanf("%d%d",&u,&v);
S.erase(S.find((*(--s[gf(u)].end())).fi+add[gf(u)]));
s[gf(u)].erase(mp(a[u],u));
a[u]+=v;
s[gf(u)].insert(mp(a[u],u));
S.insert((*(--s[gf(u)].end())).fi+add[gf(u)]);
}
else
if (str[]=='')
{
scanf("%d%d",&u,&v);
S.erase(S.find((*(--s[gf(u)].end())).fi+add[gf(u)]));
add[gf(u)]+=v;
S.insert((*(--s[gf(u)].end())).fi+add[gf(u)]);
}
else
{
scanf("%d",&u);
cnt+=u;
}
} if (str[]=='U')
{
scanf("%d%d",&u,&v);
u=gf(u);v=gf(v);
if (u!=v)
{
if (s[u].size()>s[v].size()) u^=v^=u^=v;
S.erase(S.find((*(--s[gf(u)].end())).fi+add[gf(u)]));
S.erase(S.find((*(--s[gf(v)].end())).fi+add[gf(v)]));
f[u]=v;
for (it=s[u].begin();it!=s[u].end();it++)
{
a[(*it).sc]=(*it).fi+add[u]-add[v];
s[v].insert(mp(a[(*it).sc],(*it).sc));
}
S.insert((*(--s[gf(v)].end())).fi+add[gf(v)]);
s[u].clear();
}
}
}
}

最新文章

  1. Opengl中矩阵和perspective/ortho的相互转换
  2. MySql: 忘记root密码
  3. Apache http Server 2.4 安装与配置
  4. Python Shell 解释器下使用Django Model
  5. AudioQueue语音流 speex压缩 实时通讯 对讲机
  6. debian7 编译qtopia错误解决案例
  7. 用C语言实现统计一个文件夹中各种文件的比例
  8. oracle学习(1)
  9. bzoj3667: Rabin-Miller算法
  10. docker 私有仓库查询
  11. 为什么要学习Java虚拟机
  12. 面试总结——Java篇
  13. Confluence 6 使用 CSS 样式化 Confluence 的介绍
  14. centos中nodejs npm安装cordova
  15. WPF实现打印用户界面功能
  16. visual studio build and rebuild 的区别
  17. Gerrit代码审查工具
  18. Ruby gem: Mac 系统下的安装与更新
  19. EXP-00056:遇到oracle错误12154
  20. 一步一步写数据结构(BST-二叉排序树)

热门文章

  1. WIN10 ANDROIDSTUDIO1.2 安装完首次启动报错
  2. ThreadLocal知识总结
  3. Windows下 使用CodeBlocks配置OpenGL开发环境
  4. php--分享插件
  5. 【android学习2】:Eclipse中HttpServlet类找不到
  6. Wordpress更换编辑器
  7. [LeetCode]题解(python):052-N-Queens II
  8. 删除Checkout with Multiple Addresses
  9. iOS: 讯飞语音的使用
  10. Android ListView与ExpandableListView设置分割线divider