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 思路 貌似只有我是这么写的 线段树合并, 每个线段树存每个连通块的信息,维护点的 ...
随机推荐
- 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]
Vladik and Entertaining Flags Time Limit: 20 Sec Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...
- 【51nod】1238 最小公倍数之和 V3 杜教筛
[题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...
- MySql 复制表命令
1.只复制表结构到新表 CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2; 或 CREATE TABLE 新表 LIKE 旧表 ; 注意上面两种方式,前一种方式是不 ...
- Price(洛谷P4109 [HEOI2015]定价)
题目 思路: 按照我的思路这一题应该是这样子的 剔除+判断 剔除 因为后面的0要越多越好,所以我们判断0出现的情况,当2个数之间的差大与10时,证明2个之间会存在一个0,所以这一位我们可以把它去掉,相 ...
- Ubuntu命令设置ip网关dns
本文系转载,介绍Ubuntu如何设置IP和网络来连接网络 如果是在虚拟机中使用Ubuntu,那么设置之前请先参照我的上一遍文章虚拟机Net方式设置连接外网中的网络设置部分,先设置好主机的网络,然后配置 ...
- 判断Selenium加载完成
How do you make Selenium 2.0 wait for the page to load? You can also check pageloaded using followin ...
- 大数据系列之Kafka安装
先简单说下安装kafka的流程..(可配置多个zookeeper,这篇文只说一个zookeeper场景) 1.环境配置:jdk1.7+ (LZ用的是jdk1.8) 2.资料准备:下载 kafka_2. ...
- IP地址及子网--四种IP广播地址
国际规定:把所有的IP地址划分为 A,B,C,D,E. 类默认子网掩码:A类为 255.0.0.0; B类为 255.255.0.0; C类为 255.255.255.0.子网掩码是一个32位地址,用 ...
- tp总结
不知不觉学tp也快一个月了,虽然还处于一个仅仅只会使用的阶段,但毕竟算是我详细接触的第一个脚本框架,tp还是让我收获了许多. 废话不多说,先列出几个对于我这种新手来说tp新奇而实用的地方. 1.连贯操 ...
- 数据分析python应用到的ggplot(二)
还是优达学院的第七课 数据:https://s3.amazonaws.com/content.udacity-data.com/courses/ud359/hr_by_team_year_sf_la. ...