bzoj 4736: 温暖会指引我们前行 (LCT 维护最大生成树)

链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4736

题面:

寒冬又一次肆虐了北国大地

无情的北风穿透了人们御寒的衣物

可怜虫们在冬夜中发出无助的哀嚎

“冻死宝宝了!”

这时

远处的天边出现了一位火焰之神

“我将赐予你们温暖和希望!”

只见他的身体中喷射出火焰之力

通过坚固的钢铁,传遍了千家万户

这时,只听见人们欢呼

“暖气来啦!”

任务描述

虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低。

小R的宿舍楼中有nn个地点和一些路,一条路连接了两个地点,小R可以通过这条路从其中任意一个地点到达另外一个地点。但在刚开始,小R还不熟悉宿舍楼中的任何一条路,所以他会慢慢地发现这些路,他在发现一条路时还会知道这条路的温度和长度。每条路的温度都是互不相同的。

小R需要在宿舍楼中活动,每次他都需要从一个地点到达另一个地点。小R希望每次活动时经过一条最温暖的路径,最温暖的路径的定义为,将路径上各条路的温度从小到大排序后字典序最大。即温度最低的路温度尽量高,在满足该条件的情况下,温度第二低的路温度尽量高,以此类推。小R不会经过重复的路。由于每条路的温度互不相同,因此只存在一条最温暖的路径。

对于小R的每次活动,你需要求出小R需要走过的路径总长度。如果小R通过当前发现的路不能完成这次活动,则输出 1−1。

注意本题中的字典序与传统意义上的字典序定义有所不同,对于两个序列a,b(ab)a,b(a≠b),若aa是bb的前缀则aa的字典序较大,同时可以推出空串的字典序最大。

输入格式

第一行两个正整数 n,mn,m。表示小R的宿舍楼中有 nn 个地点,共发生了 mm 个事件。

接下来 mm 行,每行描述一个事件,事件分为三类。

  1. find id u v t lfind id u v t l 表示小R发现了一条连接uu和vv之间的路,编号为idid。相同idid的边只会出现一次。

  2. move u vmove u v 表示小R要从uu到达vv,你需要计算出最温暖的路径的长度 ,若不能从uu到达vv,则输出1−1。

  3. change id lchange id l 表示从uu到vv这条边的长度变为了ll(保证在当前时间点这条边存在)。

输出格式

对于每个询问,输出一行整数,表示最温暖的路径长度。

样例一

input

8 19
find 0 0 2 7 2
find 1 2 4 4 4
find 2 4 6 10 1
find 3 6 7 8 6
move 2 7
move 1 6
find 4 2 5 3 4
move 0 5
change 0 12
find 5 4 5 5 10
find 6 2 3 6 9
move 3 5
find 7 0 1 12 1
move 1 6
find 8 1 7 11 100
move 1 6
move 3 7
move 5 6
move 2 2

output

11
-1
6
23
18
106
122
11
0

样例二

input

15 45
find 0 1 0 8 5987
find 1 2 0 14 5455
find 2 3 0 27 8830
find 3 4 3 42 7688
find 4 5 0 25 1756
find 5 6 5 35 1550
find 6 7 4 43 9440
move 3 9
change 2 9113
move 10 13
move 3 3
move 11 10
find 7 8 7 6 7347
find 8 9 8 26 8935
move 8 4
change 3 4466
find 9 10 9 28 8560
move 6 5
find 10 11 10 31 6205
change 9 9228
find 11 12 10 23 948
find 12 13 12 45 5945
move 0 9
move 2 5
change 2 6118
find 13 14 13 12 6906
move 4 1
change 2 504
find 14 4 2 22 9796
move 10 7
move 1 14
move 13 3
find 15 12 9 39 8985
find 16 9 8 17 3710
change 1 5370
find 17 1 0 36 4669
find 18 7 6 37 8087
move 9 0
find 19 14 9 33 8234
find 20 0 4 24 5209
change 1 4883
find 21 6 3 9 2461
find 22 5 2 19 4291
change 1 7219
change 6 4846

output

-1
-1
0
-1
16787
1550
39301
7211
16571
25510
59706
46309
30692

 思路:

题面说了一大推,其实就是求最大生成树,用LCT维护下就好了

 

实现代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ls c[x][0]
#define rs c[x][1]
const int M = 4e5+10;
const int inf = 1e9;
int top;
int sum[M],c[M][2],val[M],fa[M],rev[M],mn[M],S[M],tmp[M];
inline void up(int x){sum[x] = sum[ls] + sum[rs] + val[x];mn[x] = x;if(ls&&tmp[mn[ls]] < tmp[mn[x]]) mn[x] = mn[ls];if(rs&&tmp[mn[rs]] < tmp[mn[x]]) mn[x] = mn[rs];
}inline bool isroot(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;
}inline void rotate(int x){int y = fa[x],z = fa[y];int k = c[y][1] == x;if(!isroot(y)) c[z][c[z][1]==y]=x;fa[x] = z;c[y][k] = c[x][k^1]; fa[c[x][k^1]] = y;c[x][k^1] = y; fa[y] = x;up(y); up(x);
}inline void pushdown(int x){if(!rev[x]) return ;rev[ls]^=1; rev[rs]^=1;rev[x]^=1;swap(ls,rs);
}inline void splay(int x){S[top=1]=x;for(int i = x;!isroot(i);i=fa[i]) S[++top] = fa[i];while(top) pushdown(S[top--]);while(!isroot(x)){int y = fa[x],z = fa[y];if(!isroot(y))(c[y][1]==x)^(c[z][1]==y)?rotate(x):rotate(y);rotate(x);}
}inline void access(int x){for(int y = 0;x;y = x,x = fa[x])splay(x),c[x][1] = y,up(x);
}inline void makeroot(int x){access(x); splay(x); rev[x] ^= 1;
}inline void split(int x,int y){makeroot(x); access(y); splay(y);
}inline void link(int x,int y){makeroot(x);fa[x] = y;
}inline void cut(int x,int y){split(x,y); fa[x] = c[y][0] = 0; up(y);
}inline int findroot(int x){access(x); splay(x);while(ls) x = ls;return x;
}
int main()
{int n,m;char op[15];scanf("%d%d",&n,&m);for(int i = 0;i <= n;i ++) tmp[i] = inf;while(m--){scanf("%s",op);if(op[0] == 'f') {int id,u,v,t,len;scanf("%d%d%d%d%d",&id,&u,&v,&t,&len);id++; u++; v++;tmp[id+n] = t; val[id+n] = len;if(findroot(u) != findroot(v)) link(u,id+n),link(v,id+n);else{split(u,v);// cout<<"tmp :"<<tmp[mn[v]]<<" "<<t<<" "<<val[id+n]<<endl;if(tmp[mn[v]] < t){int kk = mn[v];cut(u,kk); cut(v,kk);link(u,id+n); link(v,id+n);}}}else if(op[0] == 'm'){int u,v;scanf("%d%d",&u,&v);u++; v++;if(findroot(u) != findroot(v)) printf("-1\n");else split(u,v),printf("%d\n",sum[v]);}else {int id,len;scanf("%d%d",&id,&len); id++;makeroot(id+n); val[id+n] = len; up(id+n);}}return 0;
}

 

转载于:https://www.cnblogs.com/kls123/p/10795808.html

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

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

相关文章

WPF使用IDataErrorInfo进行数据校验

WPF使用IDataErrorInfo进行数据校验 原文:WPF使用IDataErrorInfo进行数据校验这篇博客将介绍如何使用IDataErrorInfo进行数据校验。下面直接看例子。一个Customer类&#xff0c;两个属性(FirstName, Age) class Customer {public string FirstName{get;set;}public int Age{get…

web 界面设计 Axure元件样式

找不到原创了&#xff0c;若侵权&#xff0c;请联系博主删除&#xff01;谢谢

cf 786 B 线段树优化建图

cf 786 B 链接 CF 思路 n个点&#xff0c;3种建边方式&#xff0c;规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊&#xff0c;说好的v,u变成了u,v。 两棵树&#xff0c;一棵出&#xff0c;一棵入。线段树的作用只不过是按照那个形状建边而已&#xff0c;并没啥用。 初始…

mysql -uroot -p -P3306 -h192.168.0.111无法远程连接mysql

1 在装有MySQL的机器上登录MySQL mysql -u root -p密码2 执行USE mysql; 3 执行UPDATE user SET host % WHERE user root;这一句执行完可能会报错&#xff0c;不用管它4 执行FLUSH PRIVILEGES; 4---> 刷新权限表&#xff0c;更改后需执行才能生效。 一篇博客&#xff1a;h…

iPhone6和iPhone6 plus的iOS8设计尺寸参考指南

找不到原创了&#xff0c;若侵权&#xff0c;请联系博主删除&#xff01;谢谢

欧几里得

转载于:https://www.cnblogs.com/morui/p/10799359.html

pl/sql下DBMS_OUTPUT.PUT_LINE的输出位置

项目里存储过程中用到DBMS_OUTPUT.PUT_LINE进行输出日志&#xff0c;一开始不知道在哪里看&#xff0c;网上很多都是直接运行后的位置。但是储过程中的日志找了好一会&#xff0c;记录一下。 1、运行时输出位置。 declarein_interval_start_id varchar2(40);in_interval_end_id…

javaweb学习总结(四十五)——监听器(Listener)学习二

一、监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和Ser…

Excel_DATEDIF函数计算工龄、计算年假

基本语法 DATEDIF(开始日期&#xff0c;结束日期&#xff0c;unit) 基本用法&#xff1a; 实战&#xff1a; 1、计算工龄&#xff1a; 2、计算年假 转载于:https://www.cnblogs.com/wodexk/p/10799890.html

Cordova - 彻底搞定IOS编译!

操作系统&#xff1a;OSX10.14 XCode&#xff1a;10.1 Cordova&#xff1a;8.1.2 假设已经配置好了Cordova开发环境&#xff0c;Apple ID你也有&#xff0c;XCode也可以正常工作了&#xff0c;那么就可以继续看这篇文章了&#xff01; 如果你没有看我这篇文章&#xff0c;那么你…

javaweb学习总结(四十四)——监听器(Listener)学习

一、监听器介绍 1.1、监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象&#xff0c;当被监视的对象发生情况时&#xff0c;立即采取相应的行动。监听器其 实就是一个实现特定接口的普通java程序&#xff0c;这个程序专门用于监听…

第一期冲刺01

1、我昨天的成就 确定了软件所满足的需求 2、遇到什么困难 跟航哥有太多想要实现的&#xff0c;但后续慢慢找到了重点 3、今天的任务 安装安卓studio 配置好编程所需要的环境 转载于:https://www.cnblogs.com/zjm15511858030/p/11065660.html

vue无缝滚动的插件开发填坑分享

写插件的初衷 1.项目经常需要无缝滚动效果&#xff0c;当时写jq的时候用用msClass这个老插件&#xff0c;相对不上很好用。2.后来转向vue在vue-awesome没有找到好的无缝滚动插件&#xff0c;除了配置swiper可以实现但是相对来说太重了&#xff0c;于是自己造了个轮子。 3.在这分…

Spring 注解 @Resource和@Autowired

Resource和Autowired两者都是做bean的注入使用。 其实Resource并不是Spring的注解&#xff0c;他的包是javax.annotation.Resource 需要导入。但是Spring支持该注解的注入。 共同点&#xff1a;两者都可以写在字段和setter方法上。两者如果都写在字段上&#xff0c;就不需要写…

洛谷 P1091 合唱队型

很容易想到维护一个最长上升子序列和一个最长下降子序列。然后枚举一个点k&#xff0c;取所有以k结尾的最长上升子序列和以k开头的最长下降子序列的长度的和中最大的&#xff0c;表示留下的人数。再用总人数减去这个&#xff0c;等于出队人数 另外类似的一道题&#xff1a;最长…

PHP常用的自定义函数

PHP常用的自定义函数 目录 php常用自定义函数类下载php 设置字符编码为utf-8路径格式化(替换双斜线为单斜线)转码打印输出api返回信息字符串截取 方法一:方法二:数组 字符串 对象 json格式的字符串互转强制类型转换php序列化serialize与返回序列化unserialeze创建日志文件获取i…

Spring注解@Component、@Repository、@Service、@Controller区别

很长时间没做web项目都把以前学的那点框架知识忘光了&#xff0c;今天把以前做的一个项目翻出来看一下发现用Component标记一个组件&#xff0c;而网上有的用Service标记组件&#xff0c;我晕就查了一下资料&#xff1a; Spring 2.5 中除了提供 Component 注释外&#xff0c;还…

春第十周作业

作业&#xff1a; 这个作业属于那个课程C语言程序设计II这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3162我在这个课程的目标是阅读并学习这个作业在那个具体方面帮助我实现目标知道了我们以后工作所需的是雇主所需的参…

在原生js中的事件监听方法

一、传统事件绑定方法我们在学习的时候&#xff0c;最初接触的事件绑定方式大多是传统事件绑定方法。传统事件绑定方法事例如下&#xff1a; window.οnlοadfunction(){alert("页面已加载"); } document.getElementById("btn").οnclickfunction(){alert(…

MySql修改数据库编码为UTF8

mysql 创建 数据库时指定编码很重要&#xff0c;很多开发者都使用了默认编码&#xff0c;乱码问题可是防不胜防。制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题。 网页数据一般采用UTF8编码&#xff0c;而数据库默认为latin 。我们可以通过修改数据库默认编码方式…