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.pswp.cn/news/249038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249038.shtml
英文地址,請注明出處:http://en.pswp.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 。我們可以通過修改數據庫默認編碼方式…