UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】
题目分析:
差评,最大生成树裸题。hack数据还卡常。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; struct LCT{
int fa[maxn],lazy[maxn],ch[maxn][],d1[maxn],d2[maxn];
int val[maxn],tot[maxn],num;
stack<int> sta;
void push_up(int now){
val[now] = min(d1[now],min(val[ch[now][]],val[ch[now][]]));
tot[now] = d2[now] + tot[ch[now][]] + tot[ch[now][]];
}
void push_down(int now){
if(lazy[now]){
swap(ch[now][],ch[now][]);
lazy[now]=;
lazy[ch[now][]] ^= ; lazy[ch[now][]] ^= ;
lazy[] = ;
}
}
int is_root(int now){return !(ch[fa[now]][]==now||ch[fa[now]][]==now);}
void r0(int now,int dr){
int ff = fa[now],gf = fa[ff],son = ch[now][dr];
int flag = is_root(ff);
ch[ff][dr^] = son; fa[son] = ff;
ch[now][dr] = ff; fa[ff] = now;
fa[now] = gf;
if(!flag){if(ch[gf][] == ff) ch[gf][] = now; else ch[gf][] = now;}
push_up(ff); push_up(now);
fa[] = ;ch[][] = ch[][] = ;
}
void splay(int now){
int pp = now;
while(!is_root(pp)) sta.push(pp),pp = fa[pp];
sta.push(pp);
while(!sta.empty()) push_down(sta.top()),sta.pop();
while(!is_root(now)){
if(is_root(fa[now])){
if(ch[fa[now]][] == now) r0(now,); else r0(now,);
}else{
int ff = fa[now],gf = fa[ff];
int alpha = ch[gf][]==ff,beta = ch[ff][]==now;
if(alpha^beta) r0(now,beta),r0(now,alpha);
else r0(ff,alpha),r0(now,beta);
}
}
}
void access(int now){
splay(now);ch[now][] = ;push_up(now);
while(fa[now]){
int nxt=fa[now];splay(nxt);ch[nxt][]=now; push_up(nxt); now=nxt;
}
}
void make_root(int now){
access(now);
splay(now);
lazy[now] ^= ;
}
void cut(int u,int v){
make_root(u); access(v); splay(u);
fa[v] = ;
if(ch[u][] == v) ch[u][] = ; else ch[u][] = ;
push_up(u);
}
void link(int u,int v){make_root(u); fa[u] = v;}
int lft(int dt){
splay(dt);
if(lazy[dt]) push_down(dt);
while(ch[dt][]){
dt = ch[dt][];
if(lazy[dt]) push_down(dt);
}
return dt;
}
int find_min(int now){
splay(now);
while(d1[now] != val[now]){
if(val[ch[now][]] == val[now]) now = ch[now][];
else now = ch[now][];
}
return now;
}
}T; int n,m,pre[maxn]; struct edge{int from,to,tmp,len;}edges[maxn]; char str[]; int found(int x){
int rx = x; while(pre[rx] != rx) rx = pre[rx];
while(pre[x]!=rx){int tt = x; pre[x] = rx; x = tt;}
return rx;
} void work(){
T.d1[] = 2e9;T.val[] = 2e9;T.d2[] = ;
for(int i=;i<=n;i++){T.num++;T.d1[i] = 2e9; T.val[i] = 2e9; pre[i] = i;}
for(int i=;i<=m;i++){
scanf("%s",str);
if(str[] == 'f'){
int id;scanf("%d",&id);
scanf("%d%d",&edges[id].from,&edges[id].to);
scanf("%d%d",&edges[id].tmp,&edges[id].len);
edges[id].from++;edges[id].to++;
T.d1[n+id+] = edges[id].tmp; T.d2[n+id+] = edges[id].len;
T.val[n+id+] = edges[id].tmp; T.tot[n+id+] = edges[id].len;
T.make_root(edges[id].from);
T.access(edges[id].to);
int pd = T.lft(edges[id].to);
if(pd == edges[id].from){
if(T.val[edges[id].to] > edges[id].tmp) continue;
int pla = T.find_min(edges[id].to);
T.make_root(pla);T.cut(pla,edges[pla-n-].from);
T.cut(pla,edges[pla-n-].to);
}
T.link(edges[id].from,n+id+);T.link(edges[id].to,n+id+);
pre[found(edges[id].from)] = found(edges[id].to);
}else{
if(str[] == 'm'){
int u,v; scanf("%d%d",&u,&v); v++;u++;
if(found(u) != found(v)){puts("-1");continue;}
T.make_root(u); T.access(v); T.splay(v);
printf("%d\n",T.tot[v]);
}else{
int id,l; scanf("%d%d",&id,&l);
T.make_root(n+id+); T.d2[n+id+] = l;
T.push_up(n+id+);
}
}
}
} int main(){
scanf("%d%d",&n,&m);
work();
return ;
}
UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】的更多相关文章
- [清华集训2016]温暖会指引我们前行——LCT+最大生成树
题目链接: [清华集训2016]温暖会指引我们前行 题目大意:有$n$个点$m$次操作,每次操作分为三种:1.在$u,v$两点之间连接一条编号为$id$,长度为$l$,温度为$t$的边.2.查询从$u ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT
题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
- bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct
[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了 ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树
Code: 行#include<bits/stdc++.h> #define ll long long #define maxn 1000000 #define inf 100000000 ...
- BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
题目链接:http://uoj.ac/problem/274 题意概述: 没什么好概述的......概述了题意就知道怎么做了......我懒嘛 分析: 就是用lct维护最大生成树. 然后如果去UOJ上 ...
随机推荐
- 谈谈自己体会到的HTML5
# 谈谈自己体会到的HTML5 很多介绍HTML5的文章,都是从以下几个方面去介绍的:语义化.丰富的表单.本地存储.多媒体.地理位置等等.纸上得来终觉浅,现在有了一定的实践经验之后,本人对其有了更加深 ...
- python--map()、reduce()
map()和reduce()是一种在处理大数据时的重要思想,在平时也可以利用.在python中内置了这两个方法,map取映射的意思,reduce取归纳的意思. 一.map() map(func, ls ...
- Spring MVC+ Spring + Mybatis从零开始搭建一个精美且实用的管理后台
点击进入<SSM搭建精美实用的管理系统>达人课页面 SSM 框架即 SpringMVC+Spring+Mybatis,相信各位朋友在投递简历时已直观感受到它的重要性,JavaWeb 相关工 ...
- 基于node.js的博客搭建
一个博客应当具备哪些功能? 前台展示 点击下一页,可以点击分类导航. 可以点击进入到具体博文页面 下方允许评论.显示发表时间.允许留言分页. 右侧有登录注册界面. 后台管理 管理员账号:登陆后看到页面 ...
- uva11300 分金币(中位数)
来源:https://vjudge.net/problem/UVA-11300 题意: 有n个人围成一圈,每个人有一定数量的金币,每次只能挪动一个位置,求挪动的最少金币使他们平分金币 题解: 蓝书p6 ...
- [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。
想在python代码中输出汉字.但是老是出现SyntaxError: Non-ASCII character '\xe4' in file test.py on line , but no encod ...
- php开发之系统函数
一些常用的php开发之系统函数的使用,可以使我们的开发效率,事倍功半 1) BC高精度函数库 2)
- C# web发布设置
1.配置文件设置: 选择"自定义",配置文件框自己输入. 2.连接设置: 3.发布版本设置 4.预览 预览没问题点发布即可.
- laravel门面和服务提供者使用
关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教. 在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel ...
- redis4.X
tar -zxvf ****cd /redismakecd /srcmake install vi redis.confdaemonize yes mkdir /usr/local/redis/bin ...