传送门

Description

有\(N\)个节点,标号从\(1\)到\(N\),这\(N\)个节点一开始相互不连通。第$ i\(个节点的初始权值为\)a_i$ ,接下来有如下一些操作:

U x y 加一条边,连接第 \(x\) 个节点和第\(y\) 个节点。

A1 x v 将第 \(x\) 个节点的权值增加 \(v\)。

A2 x v 将第 \(x\) 个节点所在的连通块的所有节点的权值都增加 \(v\)。

A3 v 将所有节点的权值都增加\(v\) 。

F1 x 输出第 \(x\) 个节点当前的权值。

F2 x 输出第 \(x\) 个节点所在的连通块中,权值最大的节点的权值。

F3 输出所有节点中,权值最大的节点的权值。

Solution

离线处理

对原序列进行重新排序,使得每次合并时,两个集合的存在区间恰好相邻

转化为简单的线段树区间修改+区间询问

Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
#define pi std::pair<int,int>
#define reg register
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=6e5+5;
int A[MN],Map[MN],fMap[MN];
struct Mapper
{
int fa[MN],L[MN],R[MN],suf[MN];
void init(int N)
{
reg int i;
for(i=1;i<=N;++i) fa[i]=L[i]=R[i]=i,suf[i]=-1;
}
int getf(int x){return fa[x]==x?x:fa[x]=getf(fa[x]);}
void insert(int x,int y)
{
x=getf(x);y=getf(y);
if(x==y) return;
suf[R[x]]=L[y];
L[y]=L[x];fa[x]=y;
}
bool vis[MN];
void getMap(int N)
{
memset(vis,0,sizeof vis);
reg int i,l,r,cnt=0;
for(i=1;i<=N;++i)if(!vis[i])
for(l=L[getf(i)];l>0;l=suf[l]) vis[fMap[++cnt]=l]=true;
for(i=1;i<=N;++i) Map[fMap[i]]=i;
}
}a;
struct Operation{int opt,x,y;}O[MN];
int readchar()
{
static char s[5];
scanf("%s",s+1);
if(s[1]=='U') return 1;
if(s[1]=='A') return 1+s[2]-'0';
if(s[1]=='F') return 4+s[2]-'0';
}
struct Union_Find
{
int fa[MN],L[MN],R[MN];
void init(int N)
{
reg int i;
for(i=1;i<=N;++i) fa[i]=i,L[i]=R[i]=Map[i];
}
int getf(int x)
{
return fa[x]==x?x:fa[x]=getf(fa[x]);
}
void combine(int x,int y)
{
x=getf(x);y=getf(y);if(x==y) return;
fa[x]=y;L[y]=min(L[y],L[x]);R[y]=max(R[x],R[y]);
}
pi get(int x)
{
x=getf(x);
return make_pair(L[x],R[x]);
}
}b;
struct SegTree
{
#define ls x<<1
#define rs x<<1|1
#define mid ((l+r)>>1)
int t[MN<<2],lazy[MN<<1];
void up(int x){t[x]=max(t[ls],t[rs]);}
void Build(int x,int l,int r)
{
if(l==r) return (void)(t[x]=A[fMap[l]]);
Build(ls,l,mid);Build(rs,mid+1,r);up(x);
}
void C(int x,int val){t[x]+=val,lazy[x]+=val;}
void down(int x){if(lazy[x])C(ls,lazy[x]),C(rs,lazy[x]),lazy[x]=0;}
void Modify(int x,int l,int r,int a,int b,int val)
{
if(l==a&&r==b) return (void)(C(x,val));down(x);
if(b<=mid) Modify(ls,l,mid,a,b,val);
else if(a>mid) Modify(rs,mid+1,r,a,b,val);
else Modify(ls,l,mid,a,mid,val),Modify(rs,mid+1,r,mid+1,b,val);
up(x);
}
int Query(int x,int l,int r,int a,int b)
{
if(l==a&&r==b) return t[x];down(x);
if(b<=mid) return Query(ls,l,mid,a,b);
else if(a>mid) return Query(rs,mid+1,r,a,b);
else return max(Query(ls,l,mid,a,mid),Query(rs,mid+1,r,mid+1,b));
}
}c;
int main()
{
reg int i,N=read(); a.init(N);
for(i=1;i<=N;++i) A[i]=read();
reg int M=read();
for(i=1;i<=M;++i)
{
O[i].opt=readchar();
if(O[i].opt<7) O[i].x=read();
if(O[i].opt<4) O[i].y=read();
if(O[i].opt==1) a.insert(O[i].x,O[i].y);
}
a.getMap(N);c.Build(1,1,N);b.init(N);pi xxx;
for(i=1;i<=M;++i)
{
if(O[i].opt==1) b.combine(O[i].x,O[i].y);
if(O[i].opt==2) c.Modify(1,1,N,Map[O[i].x],Map[O[i].x],O[i].y);
if(O[i].opt==3) xxx=b.get(O[i].x),c.Modify(1,1,N,xxx.first,xxx.second,O[i].y);
if(O[i].opt==4) c.Modify(1,1,N,1,N,O[i].x);
if(O[i].opt==5) printf("%d\n",c.Query(1,1,N,Map[O[i].x],Map[O[i].x]));
if(O[i].opt==6) xxx=b.get(O[i].x),printf("%d\n",c.Query(1,1,N,xxx.first,xxx.second));
if(O[i].opt==7) printf("%d\n",c.Query(1,1,N,1,N));
}
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

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

  1. BZOJ 2333 【SCOI2011】 棘手的操作

    题目链接:棘手的操作 网上的题解大部分都是在线用可并堆艹……但是树高严格\(\log\)的可并堆我不会啊……还是离线大法好…… 我们可以先把所有的合并操作用并查集给处理好,把得到的森林记录下来.然后, ...

  2. 【BZOJ2333】【SCOI2011】棘手的操作 treap合并

    题目大意 有\(n\)个节点,标号从1到\(n\),这\(n\)个节点一开始相互不连通.第\(i\)个节点的初始权值为\(a_i\),接下来有如下一些操作: \(U~x~y\):加一条边,连接第\(x ...

  3. 「SCOI2011」糖果

    蒟蒻又回来写题解了... 题面 幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. AJAX 初识

    AJAX全称为 Asynchronous Javasript And XML,是在浏览器端进行网络编程(发送请求,接收响应)的技术方案.AJAX 也就是浏览器提供的一套API,可以供 Javascri ...

  2. ECSHOP v3.0 数据库字典

    商品相关表 商品分类表 category 此表用来维护商品分类信息 字段名 字段描述 字段类型 默认值 索引 cat_id 分类编号 smallint(5) unsigned 自增 PK cat_na ...

  3. Redis数据结构和使用场景,redis内存淘汰策略

    什么样的数据适合放入Redis? sql执行耗时特别久,且结果不频繁变动的数据,适合放入Redis. Redis是单线程的,为什么会这么快? 纯内存操作 单线程操作,避免频繁的上下文切换 采用了非阻塞 ...

  4. nginx mirror/post_action+gor实现https流量复制

    关于gor: 参考: https://www.cnblogs.com/jinjiangongzuoshi/p/11773070.html https://github.com/buger/gorepl ...

  5. Redis 学习-持久化与主从复制

    一.持久化 1. RDB rdb 是 redis 内存到硬盘的快照,用于持久化 ①. 通过执行命令,主动保存快照 save # 执行保存快照,执行时 redis 会处理阻塞状态直至执行完成. bgsa ...

  6. STM32+IAR 解决Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned

    在IAR中编译STM32工程,遇到 Error[Pe147]: declaration is incompatible with "__nounwind __interwork __soft ...

  7. 初识python多线程

    目录 GIL锁 Thread类构造方法 Lock类.Rlock类 参考: python3多线程--官方教程中文版 python多线程-1 python多线程-2.1 python多线程-2.2 pyt ...

  8. 微信小程序API~检查登录状态

    wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...

  9. 一道简单的广搜题:Knight Moves

    这本来是要用双向宽度搜索的,但是我用简单的广搜也成功了,L<=300,也不会超时?? 另外一个问题就是,我本来想用原来的代码交,结果80分??将边界条件从小于L改成小于等于L,就对了.我可能不会 ...

  10. 在PHP中使用CURL实现GET和POST请求的方法

    1.CURL介绍 CURL是一个利用URL语法规定来传输文件和数据的工具.支持很多协议,如HTTP.FTP.TELNET等. 幸运的是PHP也支持CURL库.本文将介绍curl的一些高级特性,以及在P ...