uoj274 温暖会指引我们前行
来源:互联网 发布:java web项目案例 编辑:程序博客网 时间:2024/04/29 19:38
显然只需要维护最大生成树,LCT即可。
#include<cstdio>#include<algorithm>using namespace std;const int maxn=800010;void pause(){}int rd(){ int x=0; char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); } return x;}char rdc(){ char c=getchar(); while (c<'a'||c>'z') c=getchar(); return c;}int fa[maxn],son[maxn][2],sum[maxn],mnid[maxn],inv[maxn],u[maxn],v[maxn],t[maxn],l[maxn],sta[maxn],in[maxn],n,q,tot;void down(int u){ if (inv[u]) { swap(son[u][0],son[u][1]); if (son[u][0]) inv[son[u][0]]^=1; if (son[u][1]) inv[son[u][1]]^=1; inv[u]=0; }}void up(int u){ sum[u]=sum[son[u][0]]+sum[son[u][1]]+(u>n?l[u-n]:0); if (mnid[son[u][0]]!=-1&&(mnid[son[u][1]]==-1||t[mnid[son[u][0]]]<t[mnid[son[u][1]]])) mnid[u]=mnid[son[u][0]]; else mnid[u]=mnid[son[u][1]]; if (u>n&&(mnid[u]==-1||t[u-n]<t[mnid[u]])) mnid[u]=u-n;}int isroot(int u){ return son[fa[u]][0]!=u&&son[fa[u]][1]!=u;}void rot(int u,int f){ int v=son[u][f],x=son[v][f^1],y=fa[u]; if (son[y][0]==u) son[y][0]=v; if (son[y][1]==u) son[y][1]=v; fa[v]=y; son[v][f^1]=u; fa[u]=v; son[u][f]=x; if (x) fa[x]=u; up(u); up(v);}void splay(int u){ int t=u,x,fx,y,fy,top=0; while (t) { sta[++top]=t; if (isroot(t)) break; t=fa[t]; } for (;top;top--) down(sta[top]); while (!isroot(u)) { x=fa[u]; fx=son[x][1]==u; if (isroot(x)) rot(x,fx); else { y=fa[x]; fy=son[y][1]==x; if (fx==fy) rot(y,fy),rot(x,fx); else rot(x,fx),rot(y,fy); } }}void access(int u){ int v=0,t=u; while (u) { splay(u); son[u][1]=v; if (v) fa[v]=u; up(u); v=u; u=fa[u]; } splay(t);}void makeroot(int u){ access(u); inv[u]=1;}void link(int u,int v){ makeroot(u); fa[u]=v;}void cut(int u,int v){ makeroot(u); access(v); fa[u]=son[v][0]=0; up(v);}int main(){ //freopen("b.in","r",stdin); int x,y,id; char c; n=rd(); q=rd(); for (int i=0;i<=n;i++) mnid[i]=-1; while (q--) { c=rdc(); if (c=='f') { id=rd()+1; //if (id==2) pause(); mnid[id+n]=-1; u[id]=rd()+1; v[id]=rd()+1; t[id]=rd(); l[id]=rd(); sum[id+n]=l[id]; mnid[id+n]=id; makeroot(u[id]); access(v[id]); if (!isroot(u[id])) { x=mnid[v[id]]; if (t[id]>t[x]) { cut(u[id],x+n); cut(v[id],x+n); link(u[id],id+n); link(v[id],id+n); in[x]=0; in[id]=1; } } else { link(u[id],id+n); link(v[id],id+n); in[id]=1; } } else if (c=='m') { x=rd()+1; y=rd()+1; if (x==y) { printf("0\n"); continue; } makeroot(x); access(y); if (!isroot(x)) printf("%d\n",sum[y]); else printf("-1\n"); } else { id=rd()+1; x=rd(); if (in[id]) { cut(u[id],id+n); cut(v[id],id+n); sum[id+n]=l[id]=x; link(u[id],id+n); link(v[id],id+n); } } }}
阅读全文
0 0
- uoj274 温暖会指引我们前行
- 【uoj274】【清华集训2016】温暖会指引我们前行
- uoj 279: [清华集训2016]温暖会指引我们前行
- UOJ#274 BZOJ4736 【清华集训2016】温暖会指引我们前行
- BZOJ 4736/UOJ #274. 【清华集训2016】温暖会指引我们前行 LCT边权操作
- uoj#274. 【清华集训2016】温暖会指引我们前行 //LCT
- 2016,我们继续前行
- 2017我们一起前行!
- 2015,我们一起温暖成长!
- 项目晨会指引
- 一杯奶可以温暖我们一辈子
- 温暖
- 温暖
- 温暖
- 温暖
- 我们都在寂寞里前行
- 伟大领袖乔布斯,指引我们向前进
- 致军哥,指引我们走向未来的人
- C++ 类构造函数 & 析构函数
- Is It A Tree?
- 精仿今日头条
- React组件生命周期
- 三.SpringBoot集成实例系列-注解型单数据源mybatis
- uoj274 温暖会指引我们前行
- “无法找到xxx.exe的调试信息,或者调试信息不匹配。未调用调试信息生成二进制文件……”问题的解决办法
- Java运算符
- Java中的三种内部类
- 关于major和无人驾驶的一点想法(写给一个微信群)
- Elasticsearch & plugins(ELK+kafka+filebeat) 安装教程
- textfield datepicker作为响应者、自定义toolbar方法
- OAI搭建之SIM卡
- 欢迎登陆页面!