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

  题目传送门

棘手的操作

题目描述

有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: 输出所有节点中,权值最大的节点的权值

输入输出格式

输入格式:

输入的第一行是一个整数N,代表节点个数。接下来一行输入N个整数,a[1], a[2], ..., a[N],代表N个节点的初始权值。再下一行输入一个整数Q,代表接下来的操作数。最后输入Q行,每行的格式如题目描述所示。

输出格式:

对于操作F1, F2, F3,输出对应的结果,每个结果占一行。

输入输出样例

 

输入样例#1: 
3
0 0 0
8
A1 3 -20
A1 2 20
U 1 3
A2 1 10
F1 3
F2 3
A3 -10
F3
输出样例#1: 
-10
10
10

说明

对于30%的数据,保证 N<=100,Q<=10000

对于80%的数据,保证 N<=100000,Q<=100000

对于100%的数据,保证 N<=300000,Q<=300000

对于所有的数据,保证输入合法,并且 -1000<=v, a[1], a[2], ..., a[N]<=1000

 


  分析:

  真是一道恶心的左偏树题。

  需要维护两个左偏树,第一个维护正常的操作信息,第二个维护所有点中的最大值。

  第一种操作:在第一个左偏树中$merge$即可,另外有一个小优化,合并的两个堆顶中较小的一个可以直接从第二个左偏树中删除(正确性自己思考)。

  第二种操作:将该点从两个左偏树中删除,修改值以后再重新放回去。

  第三种操作:用$lazy$标记,只修改堆顶的值,后面再$merge$或者删除节点的时候下方标记。

  第四种操作:用一个变量记录,需要输出的时候再加上。

  第五种操作:直接输出第一个左偏树中该节点的值。

  第六种操作:直接输出第一个左偏树中该节点所在堆的堆顶的值。

  第七种操作:直接输出第二个左偏树的根节点的值。

  以上。

  题如其名,真$TM$又棘手又恶心。。。

  Code:

 

//It is made by HolseLee on 28th Aug 2018
//Luogu.org P3273
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Max(a,b) (a)>(b) ? (a) : (b)
using namespace std;const int N=3e5+7;
int n,a[N],m,allsign,root;
struct Leftist{int ch[N][2],val[N],sign[N],fa[N],dis[N];void clear(int x){ch[x][0]=ch[x][1]=fa[x]=0;}int sum(int x){int ret=0;while(x=fa[x])ret+=sign[x];return ret;}void pushdown(int x){int ul=ch[x][0], ur=ch[x][1];if( ul )val[ul]+=sign[x], sign[ul]+=sign[x];if( ur )val[ur]+=sign[x], sign[ur]+=sign[x];sign[x]=0;}int merge(int x,int y){if(!x||!y)return x+y;if( val[x]<val[y] )swap(x,y);pushdown(x);int &ul=ch[x][0], &ur=ch[x][1];ur=merge(ur,y); fa[ur]=x;if( dis[ur]>dis[ul] )swap(ul,ur);dis[x]=dis[ur]+1;return x;}int find(int x){while(fa[x])x=fa[x];return x;}int delet(int x){pushdown(x);int fx=fa[x];int ka=merge(ch[x][0],ch[x][1]);fa[ka]=fx;if( fx )ch[fx][x==ch[fx][1]]=ka;while( fx ) {if( dis[ch[fx][0]]<dis[ch[fx][1]] )swap(ch[fx][0],ch[fx][1]);if( dis[fx]==dis[ch[fx][1]]+1 )return root;dis[fx]=dis[ch[fx][1]]+1;ka=fx;fx=fa[fx];}return ka;}int add_point(int x,int v){int fx=find(x);if( fx==x ) {if( ch[x][0]+ch[x][1]==0 ){val[x]+=v; return x;} else {if( ch[x][0] ) fx=ch[x][0];else fx=ch[x][1];}}delet(x);val[x]+=v+sum(x);clear(x);return merge(find(fx),x);}int build(){queue<int>t;for(int i=1; i<=n; ++i) t.push(i);int x,y,z;while( t.size()>1 ) {x=t.front(); t.pop();y=t.front(); t.pop();z=merge(x,y);t.push(z);}return t.front();}
}T,H;void read(int &x)
{x=0; char ch=getchar(); bool flag=false;while( ch<'0' || ch>'9' ) {if( ch=='-' )flag=true;ch=getchar();}while( ch>='0' && ch<='9' ) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}flag?x*=(-1):1;
}int main()
{read(n);T.dis[0]=H.dis[0]=-1;for(int i=1; i<=n; ++i){read(a[i]);T.val[i]=H.val[i]=a[i];}root=H.build();read(m);char op[3];int x,y,fx,fy,temp;for(int i=1; i<=m; ++i){scanf("%s",op);if( op[0]=='A' ) {switch( op[1] ){case '1':read(x), read(y);root=H.delet(T.find(x));temp=T.add_point(x,y);H.val[temp]=T.val[temp];H.clear(temp);root=H.merge(root,temp);break;case '2':read(x), read(y); fx=T.find(x);root=H.delet(fx);T.val[fx]+=y; T.sign[fx]+=y;H.val[fx]=T.val[fx];H.clear(fx);root=H.merge(root,fx);break;case '3':read(y);allsign+=y;break;}} else if( op[0]=='F' ) {switch( op[1] ){case '1':read(x);printf("%d\n",T.val[x]+allsign+T.sum(x));break;case '2':read(x);printf("%d\n",T.val[T.find(x)]+allsign);break;case '3':printf("%d\n",H.val[root]+allsign);break;}} else {read(x), read(y);fx=T.find(x), fy=T.find(y);if( fx==fy )continue;temp=T.merge(fx,fy);if( temp==fx )root=H.delet(fy);else root=H.delet(fx);}}return 0;
}

 

转载于:https://www.cnblogs.com/cytus/p/9551080.html

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

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

相关文章

基于容器制作镜像

一。镜像基础 一。基于容器制作镜像 1. 查看并关联运行的容器 [ghlocalhost ~]$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4da438fc9a8e busybox …

照顾好自己才能照顾好别人_您必须照顾的5个基本数据

照顾好自己才能照顾好别人I am pretty sure that on your data journey you came across some courses, videos, articles, maybe use cases where someone takes some data, builds a classification/regression model, shows you great results, you learn how that model wo…

matlab数字仿真实验,DVR+备用电源自动投入的MATLAB数字仿真实验仿真实验

一、动态电压恢复器(DVR)的数字仿真实验动态电压恢复器(Dynamic Voltage Restorer&#xff0c;DVR)是一种基于电力电子技术的串联补偿装置&#xff0c;通常安装在电源与敏感负荷之间&#xff0c;其作用在于&#xff1a;保证电网供电质量&#xff0c;补偿供电电网产生的电压跌落…

c#,xp系统,Matlab6.5

编译环境&#xff1a;c#&#xff0c;xp系统&#xff0c;Matlab6.5 新建一个窗体项目&#xff0c;添加matlab引用。 然后试了四种方式调用matlab&#xff1a; 第一种 view plaincopy to clipboardprint?MLApp.MLAppClass matlab new MLApp.MLAppClass(); matlab.Visible 1;…

java script 对象

java script 对象 1.创建方式 1&#xff09;通过字面量的形式创建 例&#xff1b;var stt{x:1,y:2,y:3}; 或&#xff1b;var stt{ x:1, y:2, for:3 } 注意关键字必须放到引号中间 2&#xff09;通过new创建对象 例&#xff1a;var new stt(); stt.name 小鱼; stt.age 20…

认识数据分析_认识您的最佳探索数据分析新朋友

认识数据分析Visualization often plays a minimal role in the data science and model-building process, yet Tukey, the creator of Exploratory Data Analysis, specifically advocated for the heavy use of visualization to address the limitations of numerical indi…

架构探险笔记10-框架优化之文件上传

确定文件上传使用场景 通常情况下&#xff0c;我们可以通过一个form&#xff08;表单&#xff09;来上传文件&#xff0c;就以下面的“创建客户”为例来说明&#xff08;对应的文件名是customer_create.jsp&#xff09;&#xff0c;需要提供一个form&#xff0c;并将其enctype属…

matlab飞行数据仿真,基于MATLAB的飞行仿真

收稿日期: 2005 - 05 - 15   第 23卷  第 06期 计  算  机  仿  真 2006年 06月    文章编号: 1006 - 9348 (2006) 06 - 0057 - 05 基于 MATLAB的飞行仿真 张镭 ,姜洪洲 ,齐潘国 ,李洪人 (哈尔滨工业大学电液伺服仿真及试验系统研究所 ,黑龙江 哈尔滨 150001) 摘要:该…

Windows Server 2003 DNS服务安装篇

导读-- DNS(Domain Name System&#xff0c;域名系统)是一种组织成层次结构的分布式数据库&#xff0c;里面包含有从DNS域名到各种数据类型(如IP地址)的映射“贵有恒&#xff0c;何必三更起五更勤;最无益&#xff0c;只怕一日曝十日寒。”前一段时间巴哥因为一些生活琐事而中止…

正则表达式matlab,正则表达式中一个word的匹配 @MATLAB - 优秀的Free OS(Linux)版 - 北大未名BBS...

我目前想做的就是判断一个str是否可以被认为是有效的MATLAB index。最好的方法是直接运行&#xff0c;然后看运行结果或报错类型&#xff0c;但是我不打算在不知道是什么类型的东西之前运行它&#xff0c;所以可以预先parse一下&#xff0c;简单判断是否“长得跟有效的MATLAB i…

arima模型怎么拟合_7个统计测试,用于验证和帮助拟合ARIMA模型

arima模型怎么拟合什么是ARIMA&#xff1f; (What is ARIMA?) ARIMA models are one of the most classic and most widely used statistical forecasting techniques when dealing with univariate time series. It basically uses the lag values and lagged forecast error…

jQuery禁止Ajax请求缓存

一 现象 get请求在有些浏览器中会缓存。浏览器不会发送请求&#xff0c;而是使用上次请求获取到的结果。 post请求不会缓存。每次都会发送请求。 二 解决 jQuery提供了禁止Ajax请求缓存的方法&#xff1a; $.ajax({type: "get",url: "http://www.baidu.com?_&…

python 实例

参考 http://developer.51cto.com/art/201804/570408.htm 转载于:https://www.cnblogs.com/artesian0526/p/9552510.html

[WPF]ListView点击列头排序功能实现

[WPF]ListView点击列头排序功能实现 这是一个非常常见的功能&#xff0c;要求也很简单&#xff0c;在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了。微软的MSDN也已经提供了实现方式。微软的方法中&#xff0c;是通过ColumnHeader Templ…

天池幸福感的数据处理_了解幸福感与数据(第1部分)

天池幸福感的数据处理In these exceptional times, the lockdown left many of us with a lot of time to think. Think about the past and the future. Think about our way of life and our achievements. But most importantly, think about what has been and would be ou…

标线markLine的用法

series: [{markLine: {itemStyle: {normal: { lineStyle: { type: solid, color:#000 },label: { show: true, position:left } }},data: [{name: 平均线,// 支持 average, min, maxtype: average},{name: Y 轴值为 100 的水平线,yAxis: 100},[{// 起点和终点的项会共用一个 na…

php pfm 改端口,罗马2ESF和PFM 修改建筑 军团 派系 兵种等等等很多东西的教程

本帖最后由 clueber 于 2013-10-5 12:30 编辑本人是个罗马死忠加修改党&#xff0c;恩&#xff0c;所以分享一下自己的修改心得修改工具为ESF1.0.7和PFM3.0.3首先是ESF修改。ESF可以用来改开局设定和存档&#xff0c;修改开局设定是startpos.esf文件&#xff0c;在存档在我这里…

红草绿叶

从小到大喜欢阴天&#xff0c;喜欢下雨&#xff0c;喜欢那种潮湿的感觉。却又丝毫容不得脚上有一丝的水汽&#xff0c;也极其讨厌穿凉鞋。小时候特别喜欢去山上玩&#xff0c;偷桃子柿子&#xff0c;一切一切都成了美好的回忆&#xff0c;长大了&#xff0c;那些事情就都不复存…

wpf listview 使用

单列&#xff1a; <ListView Grid.Column"1" Height"284" HorizontalAlignment"Left" Margin"64,73,0,0" Name"listView1" VerticalAlignment"Top" Width"310" > <ListView.Items…

php 获取当天到23 59,js 获取当天23点59分59秒 时间戳 (最简单的方法)

原生Ajax 和Jq Ajax前言:这次介绍的是利用ajax与后台进行数据交换的小例子,所以demo必须通过服务器来打开.服务器环境非常好搭建,从网上下载wamp或xampp,一步步安装就ok,然后再把写好的页面放在服务器中指定的 ...『TCP&sol;IP详解——卷一&#xff1a;协议』读书笔记——1…