Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树
动态维护一下最小生成树即可.
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000000
#define inf 1000000000000
using namespace std; void setIO(string s)
{
string in=s+".in",out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
struct Union
{
int p[maxn];
void init()
{
for(int i=0;i<maxn;++i) p[i]=i;
}
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
void merge(int a,int b)
{
int x=find(a),y=find(b);
if(x==y) return ;
p[x]=y;
}
}ut;
struct LCT
{
#define lson ch[x][0]
#define rson ch[x][1]
int f[maxn],ch[maxn][2],sta[maxn],rev[maxn];
ll w[maxn],val[maxn],sumv[maxn],minv[maxn]; int isRoot(int x)
{
return !(ch[f[x]][0]==x||ch[f[x]][1]==x);
}
int get(int x)
{
return ch[f[x]][1]==x;
}
void pushdown(int x)
{
if(!x||!rev[x]) return;
mark(lson), mark(rson),rev[x]^=1;
}
void mark(int x)
{
if(!x) return;
swap(lson,rson),rev[x]^=1;
}
void pushup(int x)
{
if(!x) return;
sumv[x]=sumv[lson]+sumv[rson]+val[x];
minv[x]=min(min(minv[lson],minv[rson]),w[x]);
}
void rotate(int x)
{
int old = f[x], fold = f[old], which = get(x);
if(!isRoot(old)) ch[fold][ch[fold][1] == old] = x;
ch[old][which] = ch[x][which ^ 1], f[ch[old][which]] = old;
ch[x][which ^ 1] = old, f[old] = x, f[x] = fold;
pushup(old), pushup(x);
}
void splay(int x)
{
int u=x,v=0,fa;
sta[++v]=u;
while(!isRoot(u)) sta[++v]=f[u],u=f[u];
while(v) pushdown(sta[v--]);
for(u=f[u];(fa=f[x])!=u;rotate(x))
if(f[fa]!=u)
rotate(get(fa)==get(x)?fa:x);
}
void Access(int x)
{
int t=0;
while(x) splay(x),rson=t,pushup(x),t=x,x=f[x];
}
void MakeRoot(int x)
{
Access(x),splay(x), mark(x);
}
void link(int a,int b)
{
MakeRoot(a),f[a]=b;
}
int FindRoot(int x)
{
Access(x), splay(x);
while(lson) x=lson;
return x;
}
void split(int x,int y)
{
MakeRoot(x), Access(y), splay(y);
}
void cut(int a,int b)
{
split(a,b),ch[b][0]=f[a]=0, pushup(b);
}
int find(int x)
{
if(w[x]==minv[x]) return x;
return minv[lson]==minv[x]?find(lson):find(rson);
}
}tree;
int h1[maxn],h2[maxn];
char opt[20];
#define idx(i) (i+n) int main()
{
// setIO("input");
ll t;
int n,m,id,u,v,l,cur;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) tree.w[i]=inf;
tree.minv[0]=inf;
ut.init();
while(m--)
{
scanf("%s",opt);
switch(opt[0])
{
case 'f' :
{
scanf("%d%d%d%lld%d",&id,&u,&v,&t,&l);
++id,++u,++v;
h1[cur=idx(id)]=u,h2[idx(id)]=v;
if(ut.find(u)!=ut.find(v))
{
ut.merge(u,v);
tree.val[cur]=l,tree.w[cur]=t;
ut.merge(u,cur),ut.merge(v,cur);
tree.link(u,cur), tree.link(v,cur);
}
else
{
tree.split(u,v);
if(tree.minv[v] < t)
{
int k=tree.find(v);
tree.cut(k, h1[k]), tree.cut(k, h2[k]);
tree.val[cur=idx(id)]=l,tree.w[cur]=t;
ut.merge(u,cur), ut.merge(v,cur);
tree.link(u,cur),tree.link(v,cur);
}
}
break;
}
case 'm' :
{
scanf("%d%d",&u,&v);
++u,++v;
if(ut.find(u)!=ut.find(v))
{
printf("-1\n");
}
else
{
tree.split(u,v), printf("%lld\n",tree.sumv[v]);
}
break;
}
case 'c' :
{
scanf("%d%d",&id,&l);
++id;
tree.Access(cur=idx(id)),tree.val[cur]=l,tree.pushup(cur);
break;
}
}
}
return 0;
}
Uoj #274. 【清华集训2016】温暖会指引我们前行 LCT维护边权_动态最小生成树的更多相关文章
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- [清华集训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 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- 【bzoj4736/uoj#274】[清华集训2016]温暖会指引我们前行 语文题+LCT
题目描述 http://uoj.ac/problem/274 题解 语文题+LCT 对于这种语文题建议还是自己读题好一些... 读懂题后发现:由于温度互不相同,最大生成树上的路径必须走(不走的话温度大 ...
- UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】
题目分析: 差评,最大生成树裸题.hack数据还卡常. 代码: #include<bits/stdc++.h> using namespace std; ; struct LCT{ ],d ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- 【UOJ274】【清华集训2016】温暖会指引我们前行 LCT
[UOJ274][清华集训2016]温暖会指引我们前行 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很 ...
- bzoj 4736 /uoj274【清华集训2016】温暖会指引我们前行 lct
[清华集训2016]温暖会指引我们前行 统计 描述 提交 自定义测试 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了 ...
- BZOJ 4736 温暖会指引我们前行 LCT+最优生成树+并查集
题目链接:http://uoj.ac/problem/274 题意概述: 没什么好概述的......概述了题意就知道怎么做了......我懒嘛 分析: 就是用lct维护最大生成树. 然后如果去UOJ上 ...
随机推荐
- 在django里用xlwt作EXCEL导出功能
参考了以前kevin的代码,搞起来快呀,哈哈哈,,阿里亚多.... 代码的意思比较明白,不注释,几乎自解释... 就是定义EXCEL时,比较硬生生的,一步一步没有快捷的方法. 另外就是取时间出来时,如 ...
- [bzoj1468][poj1741]Tree_点分治
Tree bzoj-1468 poj-1741 题目大意:给你一颗n个点的树,求树上所有路径边权和不大于m的路径条数. 注释:$1\le n\le 4\cdot 10^4$,$1\le m \le 1 ...
- OpenCV使用GPU
在使用OpenCV2.4.x的时候,以为不用重新编译可以直接使用GPU模块,不过在我使用的时候,发现使用getCudaEnabledDeviceCount()的时候,总是获得是0,于是重新编译Open ...
- QQ是怎样实现好友桌面快捷方式的?
QQ是怎样实现好友桌面快捷方式的? 不知道什么时候,QQ推出了好友桌面快捷方式.方便用户和最常保持联系的好友一键联系.核心功能一:若QQ启动了.则双击快捷方式直接打开好友聊天界面:核心功能二:若QQ未 ...
- c++ 基于Policy 的 模板编程
在没真正接触c++ 模板编程之前.真的没有想到c++ 还能够这么用.最大的感触是:太灵活了,太强大了. 最初接触模板威力还是在Delta3d中,感觉里面的模板使用实在是灵活与方便,特别是dtAI中使 ...
- Oracle VM VirtualBox使用的注意事项
Oracle VM VirtualBox使用的注意事项 Oracle VM VirtualBox 上克隆虚拟机 方法一 1.复制源虚拟里的 vdi 文件到新的目录 2.命令行进入 Oracle VM ...
- luogu3358 最长k可重区间集问题 网络流
题目大意: 关键词:最小费用最大流 不相交路径 如果两个线段重叠了,那我们则把一个线段放在下一层,另一个线段放在上一层.把流量为1的流看作一条线,一条线把位于同一层的线段(互不重叠)都串了起来.最多有 ...
- Java命名规则详细总结
Class名应是首字母大写的名词.命名时应该使其简洁而又具有描述性.异常类的命名,应以Exception结尾.Interface的命名规则与Class相同 1. JAVA源文件的命名 JAVA源文件名 ...
- codeforce1046 Bubble Cup 11 - Finals 题解
比赛的时候开G开了3h结果rose说一句那唯一一个AC的是羊的心态就崩了.. 这套题感觉质量挺好然后就back了下 A: AI robots 有三个限制条件:相互能够看见和智商的差.使用主席树,可以维 ...
- servlet中的中文乱码问题
老师总会说道:学完这个知识点,我们来谈谈中文乱码问题. 乱码的问题总是无处不在,处理不好会给用户带极差的用户体验. 那么我们来记录一下servlet中的乱码问题吧! 1.服务器向客户端响应时出现的乱码 ...