「SCOI2011」棘手的操作

传送门

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!

转载于:https://www.cnblogs.com/PaperCloud/p/10657606.html

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

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

相关文章

swft c 语言 数组,如何在swift中实现数组的深拷贝

在Objective-C中如果想将一个数组赋值给另外一个数组&#xff0c;同时想让两个数组之间相互独立(即改变其中的一个数组&#xff0c;不影响另外的一个)&#xff0c;有很多的办法&#xff0c;比如我们可以直接copy,用类方法创建新数组。这样得到的数组和原来的数组就是两个完全独…

tomcat CATALINA_HOME与CATALINA_BASE的区别

区别 https://blog.csdn.net/cfydaniel/article/details/41351927 Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量&#xff09; http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html转载于:https://www.cnblogs.com/Andrew520/p/10664921.html

android 广告栏效果,实现android广告栏效果

public classBannerLayout extendsRelativeLayout {privateViewPager mViewPager; // 轮播容器// 指示器(圆点)容器privateLinearLayout indicatorContainer;privateDrawable unSelectedDrawable;privateDrawable selectedDrawable;private intWHAT_AUTO_PLAY 1000;private boo…

自我练习

<!doctype html><html><head><meta charset"utf-8"><title>无标题文档</title><link rel"icon" href"../HTMLWork/day03/psb.ico.ico" type"img/*"></head><body> <a na…

android studio按钮槽函数,AndroidStudio按钮Button退出程序

AndroidStudio 3.1.41.创建一个新的项目&#xff0c;项目名称为Button&#xff0c;界面为activity_button.xml2.打开activity_button.xml3.点击HelloWorld标签&#xff0c;按Delete删除4.左侧组件栏选择Common - Button5.将Button组件拖到界面上&#xff0c;大概中间的位置6.右…

cobbler介绍与部署

cobbler介绍 Cobbler是一个Linux系统安装的服务&#xff0c;可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机&#xff0c;同时还可以管理DHCP&#xff0c;DNS等。 Cobbler可以使用命令行方式管理&#xff0c;也提供了基于Web的界面管理工具(cobbler-web)&#…

android wifi视频监控软件,WiFi环境下Android智能视频监控系统研究与实现

摘要&#xff1a;在互联网飞速发展和移动互联网强势崛起的时代,科技产品服务于普通生活是新兴行业必然的发展趋势;监控系统是物联网时代各个领域必然争取的可控制系统。随着无线技术和移动终端设备的高歌猛进,移动终端智能无线视频监控系统成为时下监控领域发展的热点方向。无线…

android 本地地址转换为url,android本地mipmap图片转url、绝对路径转URL URL URI File Path 转换...

标签&#xff1a; url uri file pathFile to URI:File file ...;URI uri file.toURI();File to URL:File file ...;URL url file.toURI().URL();URL to File:URL url ...;File file new Path(url.getPath()).toFile();URI to URL:URI uri ...;URL url uri.toURL();URL …

ORACLE数据库导出导入数据

准备工作&#xff1a; 1、登录管理员system 2、create directory dbdata as C:\oracle\tempData;--创建备份文件夹 3、grant read,write on directory dbdata to gsjk2018;--授权读写为用户 --导出(每次修改文件名)expdp gsjk2018/gsjk2018_vimtech10.0.73.32:1521/orcl direct…

linux sed名宁,Linux shell利用sed批量更改文件名的方法

微子网络与大家分享了在Linux shell中使用sed批量更改文件名的方法。希望你看完这篇文章有所收获。大家一起讨论一下。示例去除特定字符目标&#xff1a;把2017-01-01.jpg和2018-01-01.jpg变成20170101.jpg和20180101.jpg方法&#xff1a;用空值替换全部for filein ls | grep …

android手机给iphone越狱,一台ROOT后的安卓手机:可以用来给iOS 13越狱了

iOS 13时代的越狱工具主要包括unc0ver和Checkra1n两款&#xff0c;前者最新的v4.2.1版本已经支持A9到A13设备从除了支持的设备和系统多&#xff0c;unc0ver的一大优势在于可在iOS设备上独立完成越狱操作&#xff0c;Checkra1n则需要借助电脑&#xff0c;包括重启失效后也是如此…

502 Bad Gateway The server returned an invalid or incomplete response

问题描述&#xff1a;最近在登陆某大学网站时&#xff0c;网站如下&#xff1a; https://yzb.tju.edu.cn/ 发现登录不进去&#xff0c;报了502 Bad Gateway The server returned an invalid or incomplete response这个错误。 问题解决&#xff1a;将https改为http&#xff0…

iOS VIPER架构(三)

路由是实现模块间解耦的一个有效工具。如果要进行组件化开发&#xff0c;路由是必不可少的一部分。目前iOS上绝大部分的路由工具都是基于URL匹配的&#xff0c;优缺点都很明显。这篇文章里将会给出一个更加原生和安全的设计&#xff0c;这个设计的特点是&#xff1a; 路由时用p…

android camera滑动,Android怎么实现小米相机底部滑动指示器

Android怎么实现小米相机底部滑动指示器发布时间&#xff1a;2021-04-15 14:39:38来源&#xff1a;亿速云阅读&#xff1a;94作者&#xff1a;小新这篇文章给大家分享的是有关Android怎么实现小米相机底部滑动指示器的内容。小编觉得挺实用的&#xff0c;因此分享给大家做个参考…

laravel安装laravel-ide-helper扩展进行代码提示(二)

一、扩展的地址 https://github.com/barryvdh/laravel-ide-helper二、安装扩展 1、引入库&#xff1a; composer require barryvdh/laravel-ide-helper composer require doctrine/dbal如果只想在开发环境上使用&#xff0c;请加上--dev composer require --dev barryvdh/larav…

android md 颜色,安卓MD(Material Design)规范

Md规范是一种设计风格&#xff0c;并不特指规范。是一种模拟纸张的手法。一、核心思想把物理世界的体验带进屏幕。去掉现实中的杂质和随机性&#xff0c;保留其最原始纯净的形态、空间关系、变化与过度&#xff0c;配合虚拟世界的灵活特性&#xff0c;还原最贴近真实的体验&…

Mariadb修改root密码

2019独角兽企业重金招聘Python工程师标准>>> 默认情况下&#xff0c;新安装的 mariadb 的密码为空&#xff0c;在shell终端直接输入 mysql 就能登陆数据库。 如果是刚安装第一次使用&#xff0c;请使用 mysql_secure_installation 命令初始化。 # mysql_secure_inst…

【译】Googler如何解决编程问题

本文是Google工程师Steve Merritt的一篇博客&#xff0c;向大家介绍他自己和身边的同事解决编程问题的方法。 原文地址&#xff1a;blog.usejournal.com/how-a-googl… 在本文中&#xff0c;我将完整的向你介绍一种解决编程问题的策略&#xff0c;这个策略是我在日常工作中一直…

自学html和css,学习HTML和CSS的5大理由

描述人们学习HTML和CSS最常见的原因是开始从事web开发。但并不是只有web开发人员才要学习HTML和CSS的核心技术。作为一个网络用户&#xff0c;你需要你掌握的相关技术很多&#xff0c;但下面有5个你无法拒绝学习HTML和CSS的理由。1、轻松制作卡通动画Web上的动画很多年来都是使…

html 左侧 树形菜单,vue左侧菜单,树形图递归实现代码

学习vue有一段时间了&#xff0c;最近使用vue做了一套后台管理系统&#xff0c;左侧菜单需求是这样的&#xff0c;可以多层&#xff0c;数据由后台传递。也因为自己对官方文档的不熟悉使得自己踩了不少坑&#xff0c;今天写出来和大家一起分享。效果图如下所示&#xff1a;先说…