传送门

不难发现肯定是在温度的最大生成树上走是最优的

于是用\(LCT\)维护最大生成树,每一次加边时如果已经连通,就判断一下路径上的最小温度是否小于当前温度,是的话就断掉那条边,加入新边

//minamoto
#include<bits/stdc++.h>
#define R register
#define fi first
#define se second
#define pi pair<int,int>
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
inline char getop(){char ch;while((ch=getc())!='f'&&ch!='m'&&ch!='c');return ch;}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=4e5+5;
int ch[N][2],fa[N],v[N],sum[N],f[N],w[N],px[N],py[N];bool rev[N];pi mn[N];
int n,m,id,x,y,t,l,zz;char op;
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
inline bool is(R int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
void upd(R int x){
sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+w[x];
mn[x]=min(pi(v[x],x),min(mn[ch[x][0]],mn[ch[x][1]]));
}
inline void ppd(R int x){swap(ch[x][0],ch[x][1]),rev[x]^=1;}
inline void pd(R int x){if(rev[x])ppd(ch[x][0]),ppd(ch[x][1]),rev[x]=0;}
void update(R int x){if(!is(x))update(fa[x]);pd(x);}
void rotate(int x){
int y=fa[x],z=fa[y],d=ch[y][1]==x;
if(!is(y))ch[z][ch[z][1]==y]=x;
fa[x]=z,fa[ch[x][d^1]]=y,ch[y][d]=ch[x][d^1],ch[x][d^1]=y,fa[y]=x,upd(y);
}
void splay(int x){
update(x);
for(R int y=fa[x],z=fa[y];!is(x);y=fa[x],z=fa[y]){
if(!is(y))(ch[y][1]==x)^(ch[z][1]==y)?rotate(x):rotate(y);
rotate(x);
}upd(x);
}
inline void access(int x){
int t=0;
while(x)splay(x),ch[x][1]=t,upd(x),t=x,x=fa[x];
}
inline void makert(int x){
access(x),splay(x),ppd(x);
}
inline void split(int x,int y){
makert(x),access(y),splay(y);
}
inline void link(int x,int y){
makert(x),fa[x]=y;
}
inline void cut(int x,int y){
split(x,y),fa[x]=ch[y][0]=0,upd(y);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();
mn[0]=pi(1<<30,0);
fp(i,1,n)f[i]=i,v[i]=1<<30,mn[i]=pi(v[i],i);
while(m--){
op=getop();
switch(op){
case 'f':{
id=read()+1,x=read()+1,y=read()+1,t=read(),l=read();
v[id+n]=t,sum[id+n]=w[id+n]=l,mn[id+n]=pi(v[id+n],id+n);
px[id]=x,py[id]=y;
if(find(x)!=find(y))link(id+n,x),link(id+n,y),f[f[x]]=f[y];
else{
split(x,y);
if(mn[y].fi<t){
zz=mn[y].se-n,cut(zz+n,px[zz]),cut(zz+n,py[zz]);
link(id+n,x),link(id+n,y);
}
}
break;
}
case 'm':{
x=read()+1,y=read()+1;
if(find(x)!=find(y))print(-1);
else split(x,y),print(sum[y]);
break;
}
case 'c':{
id=read()+1,l=read();
splay(id+n),w[id+n]=l,upd(id+n);
break;
}
}
}return Ot(),0;
}

uoj#274. 【清华集训2016】温暖会指引我们前行(LCT)的更多相关文章

  1. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  2. [清华集训2016]温暖会指引我们前行——LCT+最大生成树

    题目链接: [清华集训2016]温暖会指引我们前行 题目大意:有$n$个点$m$次操作,每次操作分为三种:1.在$u,v$两点之间连接一条编号为$id$,长度为$l$,温度为$t$的边.2.查询从$u ...

  3. UOJ_274_[清华集训2016]温暖会指引我们前行_LCT

    UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...

  4. 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT

    题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...

  5. UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】

    题目分析: 差评,最大生成树裸题.hack数据还卡常. 代码: #include<bits/stdc++.h> using namespace std; ; struct LCT{ ],d ...

  6. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  7. 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT

    [UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...

  8. bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct

    [清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了 ...

  9. Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树

    Code: 行#include<bits/stdc++.h> #define ll long long #define maxn 1000000 #define inf 100000000 ...

  10. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

随机推荐

  1. eclipse中怎么删除重复的console

    eclipse中不同的应用会开启不同的console,所以并不是重复. 如图: Terminate标志/操作按钮,可以停止当前的执行,以及标志此Console是Terminated状态: Remove ...

  2. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)

    摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...

  3. ElasticSearch(九)基于version进行乐观锁并发控制

    一.基于version进行乐观锁并发控制 1).查看一条document GET /test_version/test_version_type/ { "_index" : &qu ...

  4. asp概述

    asp的理解 今天才知道,Asp原来不是一种语言,也不是一种开发工具,而是一种技术框架, 主要功能是把脚本语言,HTML,组件和Web数据库访问功能有机的结合在一起, 形成一个能在服务器端运行的应用程 ...

  5. WIN7系统设置wifi

    *&->20170302 112700 WIN7系统设置wifi, 开启win7的隐藏功能,即虚拟wifi功能和虚拟无线AP功能,即可实现将电脑变成wifi 供无线上网, 1.开始-命令 ...

  6. SpringBoot-(8)-配置MySQL数据库链接,配置数据坚挺拦截,创建默认数据表

    一,链接mysql数据库 # 数据源基本配置 spring.datasource.username=root spring.datasource.password=123456 spring.data ...

  7. ubuntu搭建mysql

    步骤1 – 安装MySQL 在 Ubuntu 16.04 中,默认情况下,只有最新版本的 MySQL 包含在 APT 软件包存储库中.在撰写本文时,那是 MySQL 5.7 要安装它,只需更新服务器上 ...

  8. (转)C++ STL set() 集合

    set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实 ...

  9. windows 下python搭建环境

    一.python安装 1,首先访问https://www.python.org/downloads/windows/去下载python版本. 2. 选择3.5版本,installer文件类型(因为3. ...

  10. 安装asterisk以及asterisk-gui

           asterisk的安装在ubuntu上自我感觉还是很方便的,虽然也会遇到一些小的问题.下面是本人遇到的   一些问题和解决方法.     1>在ubuntu10.04上安装aste ...