线段树+并查集,对于每个操作我们只需要维护他在自己子树中的最值和在整个树里的最值,类似于线段树动态开点。

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,cnt,sum,inf=1e9+,f[N],a[N],ans[N*];
struct node
{
int lz,mx,l,r;
}t[N*];
int size[N],rt[N];
char s[];
inline int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
void pushdown(int x)
{
if(t[x].lz)
{
if(t[x].l)
{
t[t[x].l].mx+=t[x].lz;
t[t[x].l].lz+=t[x].lz;
}
if(t[x].r)
{
t[t[x].r].mx+=t[x].lz;
t[t[x].r].lz+=t[x].lz;
}
t[x].lz=;
}
}
void merge(int &x,int &y,int l,int r)
{
if(!y){y=x;return;}
if(!x)return;
int mid=(l+r)>>;
pushdown(x);pushdown(y);
merge(t[x].l,t[y].l,l,mid);
merge(t[x].r,t[y].r,mid+,r);
t[y].mx=max(t[t[y].l].mx,t[t[y].r].mx);
}
int query(int p,int l,int r,int x)
{
if(l==r)return t[p].mx;
pushdown(p);
int mid=(l+r)>>;
if(x<=mid)return query(t[p].l,l,mid,x);
else return query(t[p].r,mid+,r,x);
}
void change(int &p,int l,int r,int x,int y)
{
if(!p)p=++cnt;
if(l==r){t[p].mx+=y;return;}
pushdown(p);
int mid=l+r>>;
if(x<=mid)change(t[p].l,l,mid,x,y);
else change(t[p].r,mid+,r,x,y);
t[p].mx=max(t[t[p].l].mx,t[t[p].r].mx);
}
void tmax(int p,int l,int r,int x,int y)
{
if(l==r){ans[p]=y;return ;}
int mid=(l+r)>>;
if(x<=mid)tmax(p<<,l,mid,x,y);
else tmax(p<<|,mid+,r,x,y);
ans[p]=max(ans[p<<],ans[p<<|]);
}
int main()
{
scanf("%d",&n);int x,y;
t[].mx=-inf;
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);
tmax(,,n,i,a[i]);
f[i]=i;size[i]=;
change(rt[i],,n,i,a[i]);
}
scanf("%d",&m);
for(int i=;i<=m;++i)
{
scanf("%s",s);
if(s[]=='U')
{
scanf("%d%d",&x,&y);
int fx=get(x);int fy=get(y);
if(fx==fy)continue;
if(size[fx]>size[fy])swap(fx,fy);
size[fy]+=size[fx];f[fx]=fy;
merge(rt[fx],rt[fy],,n);
tmax(,,n,fy,t[rt[fy]].mx);
tmax(,,n,fx,-inf);
}
else if(s[]=='A')
{
if(s[]=='')
{
scanf("%d%d",&x,&y);
int fx=get(x);
change(rt[fx],,n,x,y);
tmax(,,n,fx,t[rt[fx]].mx);
}
else if(s[]=='')
{
scanf("%d%d",&x,&y);
int fx=get(x);
t[rt[fx]].lz+=y;t[rt[fx]].mx+=y;
tmax(,,n,fx,t[rt[fx]].mx);
}
else scanf("%d",&y),sum+=y;
}
else
{
if(s[]=='')
{
scanf("%d",&x);
int fx=get(x);
printf("%d\n",query(rt[fx],,n,x)+sum);
}
else if(s[]=='')
{
scanf("%d",&x);
int fx=get(x);
printf("%d\n",t[rt[fx]].mx+sum);
}
else
{
printf("%d\n",sum+ans[]);
}
}
}
return ;
}

SCOI2011 棘手的操作的更多相关文章

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

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

  2. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

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

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

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

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

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

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

  6. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  7. 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]

    题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...

  8. 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作

    n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...

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

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

  10. P3273 [SCOI2011]棘手的操作

    吐槽 上午风浔凌julao问我的神题 操作又多又毒瘤又棘手... 然后bzoj题号正好是2333,2333333333 思路 貌似只有我是这么写的 线段树合并, 每个线段树存每个连通块的信息,维护点的 ...

随机推荐

  1. 20155117王震宇 2016-2017-2 《Java程序设计》第九周学习总结

    教材学习内容总结 JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据 ...

  2. Java并发编程学习路线

    一年前由于工作需要从微软技术栈入坑Java,并陆陆续续做了一个Java后台项目,目前在搞Scala+Java混合的后台开发,一直觉得并发编程是所有后台工程师的基本功,所以也学习了小一年Java的并发工 ...

  3. Web攻防系列教程之 Cookie注入攻防实战

    摘要:随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQ ...

  4. python中赋值、浅拷贝、深拷贝详解(转)

    一.赋值 >>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')139701469 ...

  5. 64_q2

    qt3-3.3.8b-69.fc26.x86_64.rpm 13-Feb-2017 01:37 3591906 qt3-MySQL-3.3.8b-69.fc26.i686.rpm 13-Feb-201 ...

  6. 64_o2

    openrdf-sesame-queryrender-2.8.10-2.fc26.noarch..> 11-Feb-2017 18:38 52014 openrdf-sesame-queryre ...

  7. Python中raw_input() & input() 的功能对比

    raw_input的功能是方便的从控制台读入数据.  input与raw_input都是Python的内建函数,实现与用户的交互,但是功能不同. 一.raw_input 下面介绍让raw_input的 ...

  8. Windows: 在系统启动时运行程序、定时计划任务、定时关机

    lesca今天介绍一些让系统在启动时,而非登录时,加载用户自定义的应用程序或脚本的方法,推荐度从前到后依次递减. 1. Windows任务计划(task scheduler) 用户可以按以下步骤进行操 ...

  9. java并发编程实战笔记---(第四章)对象的组合

    4.1设计线程安全的类 包含三个基本要素: 1.找出构成对象状态的所有变量 2.找出约束状态变量的不变性条件 2.简历对象状态的并发访问管理策略 对象的状态: 域 基本类型所有域, 引用类型包括被引用 ...

  10. 关闭windows 7的自动休眠功能

    powercfg -h off powercfg -h on https://www.tulaoshi.com/n/20160401/2075397.html powercfg -h on 该文章&l ...