SCOI2011 棘手的操作
线段树+并查集,对于每个操作我们只需要维护他在自己子树中的最值和在整个树里的最值,类似于线段树动态开点。
#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 棘手的操作的更多相关文章
- 【bzoj2333】 [SCOI2011]棘手的操作 可并堆+lazy标记
2016-05-31 21:45:41 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (学习了黄学长的代码 有如下操作: U x y ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
- 2333: [SCOI2011]棘手的操作[写不出来]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1979 Solved: 772[Submit][Stat ...
- 2333: [SCOI2011]棘手的操作[离线线段树]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2325 Solved: 909[Submit][Stat ...
- 2333: [SCOI2011]棘手的操作[我不玩了]
2333: [SCOI2011]棘手的操作 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1979 Solved: 772[Submit][Stat ...
- 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...
- 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]
题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...
- 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作
n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...
- BZOJ 2333: [SCOI2011]棘手的操作
题目描述 真的是个很棘手的操作.. 注意每删除一个点,就需要clear一次. #include<complex> #include<cstdio> using namespac ...
- P3273 [SCOI2011]棘手的操作
吐槽 上午风浔凌julao问我的神题 操作又多又毒瘤又棘手... 然后bzoj题号正好是2333,2333333333 思路 貌似只有我是这么写的 线段树合并, 每个线段树存每个连通块的信息,维护点的 ...
随机推荐
- 自己封装的ASP.NET的MYSQL的数据库操作类
/** * 作者:牛腩 * 创建时间:2010年3月7日17时35分 * 类说明:对MYSQL数据库的操作类 */ using System; using System.Data; using MyS ...
- 关于Cookie跨域的问题研究
Cookie是一个伟大的发明,它允许Web开发者保留他们的用户的登录状态.但是当你的站点有一个以上的域名时就会出现问题了.在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名 ...
- css3同心圆闪烁扩散效果
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- javascript复习笔记
/* Javascript:用来在页面中编写特效,和HTML.CSS一样都是有浏览器解析 Javascript语言: 一.JS如何运行(javascript,jscript,vbscript,appl ...
- 使用qt写的简单的图片浏览器
功能特别简单,支持png,jpg,bmp,gif文件,支持自适应窗口大小,支持放大缩小,旋转功能还有点问题,支持上下按键选择图片 因为初学qt,所以很多东西都不太会,而且c++学的不是太好,没有怎么使 ...
- discuz各个目录与文件的作用说明
discuz下面有很多文件夹以及文件,你们都知道他们是做什么的么?肯定不知道了吧.但是我们有经常遇到这些文件,譬如在后台文件校验操作都遇到某些文件被修改,这时候也需要知道这些文件是有什么作用的.今天就 ...
- flask插件系列之flask_restful设计API
前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...
- [001] leap_stage
[Description] There is a number in each stages that indicates the most stages you can leap up. Now, ...
- 在新版linux上编译老版本的kernel出现kernel/timeconst.h] Error 255
在使用ubuntu16.4编译Linux-2.6.31内核时出现这样的错误 可以修改timeconst.pl的内容后正常编译. 以下是编译错误提示的内容: Can't use 'defined(@ar ...
- Mac OS X 编译android内核 error: elf.h: No such file or directory 的解决方法
1. 从网上下个elf.h放到scripts/mod/文件夹(http://www.rockbox.org/tracker/9006?getfile=16683) 2. 修改两个文件mk_elfcon ...