网上都是可并堆在线搞,其实直接离线处理处每个联通块,然后把他们放一起,然后点更新,区间询问就可以了。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 100000000
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define getmid int mid=(l+r)>>1
#define maxn 1200000
int tree[maxn],add[maxn];
int n,m,a[maxn],save[maxn];
int next[maxn],id,w[maxn],ed[maxn],fa[maxn];
struct Q
{int o,x,y;void scan(){char s[3];scanf("%s",s);if(*s=='U')scanf("%d %d",&x,&y),o=1;else if(*s=='A'&&s[1]=='1')scanf("%d %d",&x,&y),o=2;else if(*s=='A'&&s[1]=='2')scanf("%d %d",&x,&y),o=3;else if(*s=='A'&&s[1]=='3')scanf("%d",&x),o=4;else if(*s=='F'&&s[1]=='1')scanf("%d",&x),o=5;else if(*s=='F'&&s[1]=='2')scanf("%d",&x),o=6;else if(*s=='F'&&s[1]=='3')o=7;}
}q[300020];
void pushup(int rt)
{tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void pushdown(int rt)
{if(add[rt]){add[rt<<1]+=add[rt];add[rt<<1|1]+=add[rt];tree[rt<<1]+=add[rt];tree[rt<<1|1]+=add[rt];add[rt]=0;}
}
void update(int l,int r,int rt,int x,int y,int v)
{if(x<=l&&r<=y){add[rt]+=v;tree[rt]+=v;return;}pushdown(rt);getmid;if(x<=mid) update(lson,x,y,v);if(y>mid) update(rson,x,y,v);pushup(rt);
}
int qmax(int l,int r,int rt,int x,int y)
{if(x<=l&&r<=y){return tree[rt];}pushdown(rt);getmid;int ans=-INF;if(x<=mid) ans=max(ans,qmax(lson,x,y));if(y>mid) ans=max(ans,qmax(rson,x,y));return ans;
}
void build(int l,int r,int rt)
{if(l==r){tree[rt]=save[l];return;}getmid;build(lson);build(rson);pushup(rt);
}
int getf(int x)
{return fa[x]==x?x:fa[x]=getf(fa[x]);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)fa[i]=i,ed[i]=i;scanf("%d",&m);int r1,r2;for(int i=1;i<=m;i++){q[i].scan();if(q[i].o==1){r1=getf(q[i].x);r2=getf(q[i].y);if(r1==r2) continue;fa[r2]=r1;next[ed[r1]]=r2;ed[r1]=ed[r2];}}for(int i=1;i<=n;i++){if(getf(i)==i){for(int j=i;j;j=next[j]){id++;w[j]=id;save[id]=a[j];}}}build(1,n,1);/*for(int i=1;i<=n;i++){printf("%d ",save[i]);printf("%d\n",qmax(1,n,1,w[i],w[i]));}*/for(int i=1;i<=n;i++){fa[i]=i;ed[i]=i;}for(int i=1;i<=m;i++){if(q[i].o==1){r1=getf(q[i].x);r2=getf(q[i].y);if(r1==r2)continue;fa[r2]=r1;ed[r1]=ed[r2] ;}else if(q[i].o==2)update(1,n,1,w[q[i].x],w[q[i].x],q[i].y);else if(q[i].o==3)update(1,n,1,w[getf(q[i].x)],w[ed[getf(q[i].x)]],q[i].y);else if(q[i].o==4)update(1,n,1,1,n,q[i].x);else if(q[i].o==5)printf("%d\n",qmax(1,n,1,w[q[i].x],w[q[i].x]));else if(q[i].o==6)printf("%d\n",qmax(1,n,1,w[getf(q[i].x)],w[ed[getf(q[i].x)]]));else if(q[i].o==7)printf("%d\n",qmax(1,n,1,1,n));}return 0;
}

bzoj2333: [SCOI2011]棘手的操作 线段树+离线相关推荐

  1. BZOJ2333 [SCOI2011]棘手的操作 【离线 + 线段树】

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

  2. bzoj2333 [SCOI2011]棘手的操作(洛谷3273)

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

  3. [bzoj2333] [SCOI2011]棘手的操作 (可并堆)

    //以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个节点,标号从1 ...

  4. bzoj2333[SCOI2011]棘手的操作

    可以大力写一个平衡树启发式合并,除了每个连通块维护一个平衡树再对全局维护一个平衡树,每个节点表示某一个连通块的最大值.我的常数比较大,危险地卡过去了. #include<cstdio> # ...

  5. HDU - 4417 Super Mario(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  6. SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数 题目分析:莫队模板题,直接套板子就好了 有点意思的是函数返回值为布尔类型,然后没有r ...

  7. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  8. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

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

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

最新文章

  1. 燃爆,100个Python实战小项目汇总!
  2. 《小岛经济学--鱼、美元和经济的故事》Digest
  3. 在 Rss Bandit 和 SharpDevelop 之间的权衡
  4. 【新星计划】MATLAB-冒号:符号详解
  5. 1 Orchard 入门篇-Orchard 基本概念
  6. 龙之谷哪个服务器最多,龙之谷哪些服务器数据互通 龙之谷数据互通详情介绍...
  7. 一文吃透PHP和HTML的嵌套写法
  8. springboot+jpa+mysql+redis+swagger整合步骤
  9. Bootstrap缩略图.thumbnail
  10. final关键字_夯实基础:Java中final关键字的几种用法
  11. 大学新颖的管理系统毕业设计题目50例
  12. 精密光纤激光打标机目前技术如何
  13. python爬取b站_python3 爬取B站视频弹幕
  14. mipi的dsi全称_MIPI DSI协议介绍
  15. python检测多重共线性程序_用 VIF 方法消除多维数据中的多重共线性
  16. pageInfo的转化,do转vo
  17. 大学四年到阿里技术专家,我是怎么走过来的
  18. 虚拟机防火墙如何关闭
  19. cb32a_c++_STL_算法_查找算法_(5)adjacent_find
  20. 请输入一个数字作为秒数,在页面按时间,分钟,秒的格式输出(如输入600,页面显示:0时10分0秒

热门文章

  1. JS中Class类的静态属性和静态方法
  2. 代码走查和代码审查_不要在代码审查上浪费时间
  3. DATEPART() 函数
  4. 国家公务员考试面试无领导小组讨论真题全透析
  5. 如何制定客户留存策略_App运营:新手都该学会的4种用户留存技巧
  6. 李阳疯狂英语突破对话(67)-周末活动
  7. c 与matlab联合编程,MATLAB与C联合编程的实现
  8. android的单元测试,Android 单元测试(Button 点击测试)
  9. java开发面试题(40个常问面试题含答案,亲测有效)
  10. PM2.5与城市化的关系