uoj279温暖会指引我们前行
暖气来啦~
动态树维护最大生成树裸题
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int maxn=;
int es[maxn][];
int n,m;
int rt,Size;
struct LCT
{
int son[maxn][],f[maxn],val[maxn],size[maxn],cnt[maxn],rev[maxn],st[maxn];
int t[maxn],len[maxn],mn[maxn],sum[maxn];
inline void update(int x)
{
int &o=x,lch=son[x][],rch=son[x][];
mn[o]=x;sum[o]=len[o];
if(son[x][])
{
if(t[mn[lch]]<t[mn[x]]) mn[o]=mn[lch];
sum[o]+=sum[lch];
}
if(son[x][])
{
if(t[mn[rch]]<t[mn[x]]) mn[o]=mn[rch];
sum[o]+=sum[rch];
}
}
inline int isroot(int x){return son[f[x]][]!=x && son[f[x]][]!=x;}
inline void rotate(int x)
{
int y=f[x],z=f[y],l,r;
if(son[y][]==x)l=;
else l=;r=l^;
if(!isroot(y))
{
if(son[z][]==y)son[z][]=x;
else son[z][]=x;
}
f[x]=z;f[y]=x;f[son[x][r]]=y;
son[y][l]=son[x][r];son[x][r]=y;
update(y);
}
inline void pushdown(int id)
{
int lch=son[id][],rch=son[id][];
if(rev[id])
{
rev[id]^=;rev[lch]^=;rev[rch]^=;
swap(son[id][],son[id][]);
}
}
inline void Splay(int x)
{
int top=;st[++top]=x;
for(int i=x;!isroot(i);i=f[i])st[++top]=f[i];
for(int i=top;i;i--)pushdown(st[i]);
while(!isroot(x))
{
int y=f[x],z=f[y];
if(!isroot(y))
{
if(son[y][]==x^son[z][]==y)rotate(x);
else rotate(y);
}
rotate(x);
}
update(x);
}
inline void access(int x)
{
int t=;
while(x)
{
Splay(x);
son[x][]=t;
t=x;
x=f[x];
update(x);
}
}
inline void makert(int x){access(x);Splay(x);rev[x]^=;}
inline void link(int x,int y){makert(x);f[x]=y;}
inline void cut(int x,int y){makert(x);access(y);Splay(y);son[y][]=f[x]=;update(y);}
inline int findf(int x)
{
access(x);Splay(x);
int y=x;
while(son[y][])y=son[y][];
return y;
}
}Tree;
char opt[];
int main()
{
scanf("%d%d",&n,&m);
int k,x,y,z;
for(int i=;i<=n;i++)Tree.t[i]=;
while(m--)
{
scanf("%s",opt);
if(opt[]=='f')
{
scanf("%d%d%d",&z,&x,&y);z++,x++,y++;
z+=n;es[z][]=x,es[z][]=y;
scanf("%d%d",&Tree.t[z],&Tree.len[z]);
if(Tree.findf(x)!=Tree.findf(y)){Tree.link(z,x),Tree.link(z,y);}
else
{
Tree.makert(x);Tree.access(y);Tree.Splay(y);
if(Tree.t[Tree.mn[y]]<Tree.t[z])
{
k=Tree.mn[y];Tree.cut(k,es[k][]);Tree.cut(k,es[k][]);
Tree.link(z,x),Tree.link(z,y);
}
}
}
else if(opt[]=='m')
{
scanf("%d%d",&x,&y);x++,y++;
if(Tree.findf(x)!=Tree.findf(y))puts("-1");
else
{
Tree.makert(x);Tree.access(y);Tree.Splay(y);
printf("%d\n",Tree.sum[y]);
}
}
else
{
scanf("%d%d",&x,&y);x++;
x+=n;Tree.Splay(x);Tree.len[x]=y;Tree.update(x);
}
}
}
uoj279温暖会指引我们前行的更多相关文章
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- 【BZOJ4736】温暖会指引我们前行(Link-Cut Tree)
[BZOJ4736]温暖会指引我们前行(Link-Cut Tree) ##题面 神TM题面是UOJ的 题解 LCT傻逼维护最大生成树 不会的可以去做一做魔法森林 #include<iostrea ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct
[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了 ...
- [清华集训2016]温暖会指引我们前行——LCT+最大生成树
题目链接: [清华集训2016]温暖会指引我们前行 题目大意:有$n$个点$m$次操作,每次操作分为三种:1.在$u,v$两点之间连接一条编号为$id$,长度为$l$,温度为$t$的边.2.查询从$u ...
- [BZOJ4736]温暖会指引我们前行
BZOJ(BZOJ上的是什么鬼...) UOJ 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小 ...
- 【刷题】UOJ #274 【清华集训2016】温暖会指引我们前行
寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 "冻死宝宝了!" 这时 远处的天边出现了一位火焰之神 "我将赐予你们温暖和希望! ...
随机推荐
- Python一些基础练习题
可变的数据类型:list, dict, set(可修改其中的元素) 不可变的数据类型:str, tuple 重点:str, list, dict (1).推导式练习 # 利用列表推导式: 找出100以 ...
- 【BZOJ1109】[POI2007]堆积木Klo 二维偏序
[BZOJ1109][POI2007]堆积木Klo Description Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体.每个积木上面都有一个数.Mary用他的所有积木垒了一个高塔 ...
- 九度OJ 1346:会员积分排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:967 解决:413 题目描述: 元旦佳节快到了,超市A想要给会员一些奖品.但是奖品有限,所以它需要给这些会员做一个排序,然后将名单输出来.排 ...
- python字典中包含列表时:查找字典中某个元素及赋值
直接上代码: 运行效果:
- 【python】-- 模块、os、sys、time/datetime、random、logging、re
模块 模块,用一堆代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个 ...
- windows10下载
http://care.dlservice.microsoft.com/dl/download/F/5/7/F574727C-B145-4A7D-B85B-11C4E8DC894B/9841.0.14 ...
- Java并发之BlockingQueue
一.Queue Queue是队列接口是 Collection的子接口.除了基本的 Collection操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时 ...
- Crontab使用详解
第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...
- || and && 理解
逻辑或(||): 只要第一个值的布尔值为false,那么永远返回第二个值. 逻辑或属于短路操作,第一个值为true时,不再操作第二个值,且返回第一个值. 逻辑与(&&): 只要第一个值 ...
- 怎么在js里写html
<html> <head> <meta charset="utf-8"/> <title>示例前端模板写在代码里</title ...