P3273-[SCOI2011]棘手的操作【线段树,并查集】

正题

题目链接:https://www.luogu.com.cn/problem/P3273


题目大意

nnn个点有权值,要求支持操作

  1. 连接两个点
  2. 单点加权
  3. 联通块加权
  4. 全图加权
  5. 单点询问
  6. 联通块询问最大值
  7. 全图询问最大值

解题思路

把所有可能产生的联通块都变到一个区间里就好了

考虑怎么排这个东西,可以先离线,每次加边的时候连接两个联通块根,这样跑出来的dfsdfsdfs序就是符合要求的。

注意因为邻接表是按照加边的顺序倒着枚举的,所以要反过来加边。

然后用线段树直接维护答案就好了

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e5+10;
struct qnode{char op[3];int x,y;
}p[N];
struct node{int to,next;
}a[N];
int n,q,tot,cnt,ls[N],w[N],fa[N],l[N],r[N];
struct SegTree{int w[N<<2],lazy[N<<2];void Downdata(int x){if(!lazy[x])return;w[x*2]+=lazy[x];lazy[x*2]+=lazy[x];w[x*2+1]+=lazy[x];lazy[x*2+1]+=lazy[x];lazy[x]=0;return;}void Change(int x,int L,int R,int l,int r,int val){if(L==l&&R==r){w[x]+=val;lazy[x]+=val;return;}int mid=(L+R)>>1;Downdata(x);if(r<=mid)Change(x*2,L,mid,l,r,val);else if(l>mid)Change(x*2+1,mid+1,R,l,r,val);else Change(x*2,L,mid,l,mid,val),Change(x*2+1,mid+1,R,mid+1,r,val);w[x]=max(w[x*2],w[x*2+1]);return;}int Ask(int x,int L,int R,int l,int r){if(L==l&&R==r){return w[x];}int mid=(L+R)>>1;Downdata(x);if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return max(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));}
}T;
void addl(int x,int y){if(x==y)return;a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void dfs(int x){l[x]=r[x]=++cnt;T.Change(1,1,n,cnt,cnt,w[x]);for(int i=ls[x];i;i=a[i].next)dfs(a[i].to);return;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&w[i]),fa[i]=i;scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%s",p[i].op);if(p[i].op[0]=='U'){scanf("%d%d",&p[i].x,&p[i].y);p[i].x=find(p[i].x);p[i].y=find(p[i].y);if(p[i].x==p[i].y)continue;if(p[i].x<p[i].y)swap(p[i].x,p[i].y);fa[p[i].y]=p[i].x;}else if(p[i].op[0]=='A'&&p[i].op[1]=='1')scanf("%d%d",&p[i].x,&p[i].y);else if(p[i].op[0]=='A'&&p[i].op[1]=='2')scanf("%d%d",&p[i].x,&p[i].y);else if(p[i].op[0]!='F'||p[i].op[1]!='3')scanf("%d",&p[i].x);}for(int i=q;i>=1;i--)if(p[i].op[0]=='U')addl(p[i].x,p[i].y);for(int i=1;i<=n;i++)if(find(i)==i)dfs(i);for(int i=1;i<=n;i++)fa[i]=i;for(int i=1;i<=q;i++){int x=p[i].x,y=p[i].y;if(p[i].op[0]=='U'){if(x==y)continue;fa[y]=x;r[x]=r[y];}else if(p[i].op[0]=='A'&&p[i].op[1]=='1')T.Change(1,1,n,l[x],l[x],y);else if(p[i].op[0]=='A'&&p[i].op[1]=='2')x=find(x),T.Change(1,1,n,l[x],r[x],y);else if(p[i].op[0]=='A'&&p[i].op[1]=='3')T.Change(1,1,n,1,n,x);else if(p[i].op[0]=='F'&&p[i].op[1]=='1')printf("%d\n",T.Ask(1,1,n,l[x],l[x]));else if(p[i].op[0]=='F'&&p[i].op[1]=='2')x=find(x),printf("%d\n",T.Ask(1,1,n,l[x],r[x]));else printf("%d\n",T.Ask(1,1,n,1,n));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客练习赛 65 (待补E-网络流)

A.最值序列 排序后&#xff0c;前一半加后一半乘即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N500010; cons…

持续集成配置之Nuget

Intro本文是基于微软的 VSTS(Visual Studio Team Service) 做实现公众类库的自动打包及发布。之前自己的项目有通过 Github 上的 Travis 和 Appveyor&#xff0c;这次主要是用 VSTS 来做的&#xff0c;对比 appveyor 和 vsts 上的持续集成&#xff0c;vsts 上微软把常用的工具和…

【每日一题】8月7日题目精讲—双栈排序

来源&#xff1a;牛客网 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 Tom最近在研究一个有趣的排序问…

【期望DP】概率充电器(luogu 4284)

正题 luogu 4284 题目大意 给你棵树&#xff0c;第i个点自己通电的概率是wiw_iwi​&#xff0c;第j条边连接的两个点之间通电的概率是pjp_jpj​&#xff0c;问你通电的点个数的期望值 题目大意 设fif_ifi​为第i个点通电的概率&#xff0c;那么&#xff1a; fisolvej∈link{…

P3760-[TJOI2017]异或和【树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P3760 题目大意 给出nnn个数字的一个序列aaa&#xff0c;求它所有区间和的异或和 n≤105,∑ai≤106n\leq 10^5,\sum a_i\leq 10^6n≤105,∑ai​≤106 解题思路 开始写了个前缀和FFTFFTFFT发现要卡常然后就换了个方法。 每一…

手把手教你搭APM之Skywalking搭建指南(支持Java/C#/Node.js)

前言什么是APM?全称:Application Performance Management可以参考这里:现代APM体系&#xff0c;基本都是参考Google的Dapper&#xff08;大规模分布式系统的跟踪系统&#xff09;的体系来做的。通过跟踪请求的处理过程&#xff0c;来对应用系统在前后端处理、服务端调用的性能…

牛客练习赛 64——错排

A.怪盗-1412 111…1⏟⌊n2⌋444…4⏟m111…1⏟⌈n2⌉222…2⏟k\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lfloor \frac{n}{2} \rfloor \end {matrix}\begin{matrix} \underbrace{ 444\dots\ 4} \\ m \end{matrix}\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lceil \fra…

牛客网状压dp

状压dp 视频链接 &#xff08;如果想购买网课&#xff0c;可以用我的邀请码&#xff09; 用我的链接购买&#xff0c;我再反你10&#xff0c;一共花54多值 购买链接 不放心可以先加我好友2830872914 总试题链接 文章目录状压dp预备知识——位运算例题&#xff1a;引入&#x…

【线段树】海报(loj 3264)

正题 loj 3264 题目大意 有一个环&#xff0c;环上n个点&#xff0c;权值为a&#xff0c;有m次修改&#xff0c;每次修改一个aia_iai​&#xff0c;然后让你选取一些数&#xff0c;使环上不存在连续四个以上的数被选取&#xff0c;让你求所选数的最大权值和 解题思路 不难想…

P4338-[ZJOI2018]历史【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/P4338 题目大意 给出nnn个点的一棵树&#xff0c;和每个点进行accessaccessaccess的次数aia_iai​&#xff0c;要求安排一个顺序使得虚实边转换最多。 mmm次修改一个点让aia_iai​加上www后求答案 n,m∈[1,4∗105],ai,w∈[1,…

小G有一个大树

来源&#xff1a;牛客网 &#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小G想要把自己家院子里的橘子树搬到家门口&#xff08;QAQ。。就当小G是大力水手吧&…

.Net Core功能开关实战

为了快速发布开发完成的功能&#xff0c;企业通常会以比较快的迭代周期持续发布。但是由于某些 原因或场景&#xff0c;需要在发布的时候将某些功能隐藏起来或者小规模的开放&#xff08;例如只有某些特定用户可以使用、或者特定日期开放&#xff09;&#xff0c;通过使用功能开…

AtCoder Beginner Contest 179 总结

A - Plural Form 模拟签到题1 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<string> #include<iostream> #include<algorithm> using namespace std; const int N100010; int main() {IO;int T1;//cin…

纪中A组模拟赛总结(2021.7.19)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3101010lyflyflyf175175175000757575100100100 前言&#xff1a;进前10啦&#xff01;&#xff01; 总结 T1看着推了一下&#xff0c;发现可以改变答案的解决顺序&#xff0c;然后在O(n)内求解&#xff0c;打完…

AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】

正题 题目链接:https://www.luogu.com.cn/problem/AT4505 题目大意 给出nnn个点和n−1n-1n−1个点集UiU_iUi​&#xff0c;每个点集中选择两个点连边使得该图是一棵树。求方案。 n∈[1,105],∑i1n−1∣Ui∣∈[1,2∗105]n\in[1,10^5],\sum_{i1}^{n-1} |U_i|\in[1,2*10^5]n∈[1…

学习究竟是为了什么?

今天无意中看到一句话&#xff0c;人如果停止了学习&#xff0c;就开始走向失败。这句话其实应该送给每一个面临30岁焦虑期的开发者&#xff0c;同时也应该成为每一个开发者内心的真实写照。 想问一下大家一个问题&#xff0c;多久没有学习新的知识呢&#xff1f;尤其…

Codeforces Round #671 (Div. 2)

当天晚上&#xff0c;本来想参加一下比赛&#xff0c;结果感觉静不下心来做题&#xff0c;而且最难受的是读个题都不明白&#xff0c;一直在理解题意。 A - Digit Game 分析不难发现&#xff1a; 如果nnn是奇数&#xff0c;那么最后留下的数字一定是奇数位上的数字&#xff0…

【网络流】人员雇佣(luogu 1791)

正题 luogu 1791 题目大意 有n个人&#xff0c;选择第i个人的代价是aia_iai​&#xff0c;如果i,j同时被选那么有贡献wi,jw_{i,j}wi,j​&#xff0c;如果i选了j没选那么有贡献−wi,j-w_{i,j}−wi,j​&#xff0c;问你最大贡献&#xff08;减去代价&#xff09; 解题思路 最大…

AT4144-[ARC098D]Donation【Kruskal重构树,dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT4144 题目大意 nnn个点mmm条边的一张无向联通图&#xff0c;每个点有两个值ai,bia_i,b_iai​,bi​。表示经过该点时需要拥有aia_iai​元&#xff0c;该点需要捐献bib_ibi​元。 任意起点&#xff0c;询问开始时至少多少钱才…

Strategic game

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 10000K&#xff0c;其他语言20000K 64bit IO Format: %lld题目描述 Bob enjoys playing computer games, especially strategic games, but sometimes he c…