正题

P3979


题目大意

给你一棵树,让你进行一下操作:

  1. 把根节点修改为x
  2. 把x到y路径上的点权值修改为v
  3. 查询x子树中的最小权值

解题思路

可以用LCT维护该树

查询时先make_root(rt)make\_root(rt)make_root(rt),然后把x旋转到rt的儿子,再计算虚子树部分即可


code

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
using namespace std;
int n,m,x,y,z,rt,top,tot,ans,h[N],D[N];
struct Tree
{#define ls son[x][0]#define rs son[x][1]int v[N],w[N],p[N],wl[N],wv[N],pc[N],fa[N],son[N][2];multiset<int>d[N];bool NR(int x){return fa[x]&&(son[fa[x]][0]==x||son[fa[x]][1]==x);}bool IRS(int x){return son[fa[x]][1]==x;}void pushr(int x){if(!x)return;swap(ls,rs);p[x]^=1;return;}void pushc(int x,int y){if(!x)return;wv[x]=v[x]=w[x]=y;w[x]=min(wl[x],wv[x]);pc[x]=1; return;}void push_down(int x){if(!x)return;if(pc[x]){if(ls)pushc(ls,v[x]);if(rs)pushc(rs,v[x]);pc[x]=0;}if(p[x]){if(ls)pushr(ls);if(rs)pushr(rs);p[x]=0; }return;}void push_up(int x){if(!x)return;wl[x]=min(wl[ls],wl[rs]);if(d[x].size())wl[x]=min(wl[x],*d[x].begin());wv[x]=min(v[x],min(wv[ls],wv[rs]));w[x]=min(wl[x],wv[x]);return;}void rotate(int x){int y=fa[x],z=fa[y],k=IRS(x),g=son[x][!k];if(NR(y))son[z][IRS(y)]=x;if(g)fa[g]=y;fa[y]=x;fa[x]=z;son[x][!k]=y;son[y][k]=g;push_up(y);return;}void Splay(int x){int y=x;D[++top]=y;while(NR(y))y=fa[y],D[++top]=y;while(top)push_down(D[top]),top--;while(NR(x)){if(NR(fa[x])){if(IRS(x)==IRS(fa[x]))rotate(fa[x]);else rotate(x);}rotate(x);}push_up(x);return;}void access(int x){for(int y=0;x;x=fa[y=x]){Splay(x);if(rs)d[x].insert(w[rs]);rs=y;if(rs)d[x].erase(d[x].find(w[rs]));push_up(x);}return;}void make_root(int x){access(x);Splay(x);pushr(x);return;}void link(int x,int y){fa[y]=x;d[x].insert(w[y]);return;}void Split(int x,int y){make_root(x);access(y);Splay(y);return;}
}T;
struct rec
{int to,nx;
}e[N<<1];
void add(int x,int y)
{e[++tot].to=y;e[tot].nx=h[x];h[x]=tot;return;
}
int read()
{char c=getchar();int ds=0,fs=1;while (c<'0'||'9'<c) {if (c=='-') fs=-1;c=getchar();}while (c>='0'&&c<='9') ds=(ds<<3)+(ds<<1)+c-48,c=getchar();return ds*fs;
}
void dfs(int x,int fa)
{for(int i=h[x];i;i=e[i].nx){int y=e[i].to;if(y!=fa){dfs(y,x);T.link(x,y);}}T.push_up(x);return;
}
int main()
{scanf("%d%d",&n,&m);T.v[0]=T.wl[0]=T.wv[0]=T.w[0]=2147483647;for(int i=1;i<n;++i){scanf("%d%d",&x,&y);add(x,y);add(y,x);}for(int i=1;i<=n;++i)T.v[i]=read();scanf("%d",&rt);dfs(rt,0);while(m--){x=read();if(x==1)scanf("%d",&rt);else if(x==2){scanf("%d%d%d",&x,&y,&z);T.Split(x,y);T.pushc(y,z);}else{scanf("%d",&x);T.make_root(rt);T.Split(rt,x);ans=T.v[x];if(T.d[x].size())ans=min(ans,*T.d[x].begin()); //Split中xaccess了,所以没有右子树printf("%d\n",ans);}}return 0;
}

【LCT】遥远的国度(P3979)相关推荐

  1. P3979 遥远的国度

    题目描述 zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn完成 ...

  2. [洛谷P3979]遥远的国度

    题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...

  3. 2019.03.01 bzoj2555: SubString(sam+lct)

    传送门 题意简述: 要求在线支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 思路: 考虑用lctlctlct来动态维护samsa ...

  4. 洛谷.4234.最小差值生成树(LCT)

    题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...

  5. bzoj 4025 二分图——线段树分治+LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...

  6. BZOJ2631tree——LCT

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的 ...

  7. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  8. 【BZOJ4817】【SDOI2017】树点涂色 [LCT][线段树]

    树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Description Bob有一棵n个点的有根树,其中 ...

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

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

最新文章

  1. 模拟RAID-10其中一个硬盘损坏
  2. 数据结构与算法JavaScript描述——链表
  3. 条款13:以对象管理资源
  4. 京东宣布收购拇指阅读,具体金额未披露
  5. 距离高考出成绩,一年了、、、
  6. 查询已有链表的hashmap_面试官再问你 HashMap 底层原理,就把这篇文章甩给他看...
  7. bootstrap datetimepicker、bootstrap datepicker日期组件对范围的简单封装
  8. 关于四则运算的设计思想
  9. Error:(1, 1) java: 非法字符: ‘\ufeff’
  10. NLP之路-warm up
  11. drop table 、delete table和truncate table的区别
  12. js实现checkbox全选、不选与反选
  13. SQLite的使用一
  14. Linux vi命令详解与使用教程
  15. 电信IHO-3000机顶盒高安版 悦ME刷机固件
  16. Tesseract文字训练,以及样本生成
  17. 计算机辅助设计 Photoshop 教案,计算机辅助设计(photoshop)
  18. python dataframe 列筛选_pandas系列之DataFrame 行列数据筛选实例
  19. php 汉王云名片_风吹雨名片互赞系统PHP程序
  20. 计算机服务flash,Flash Player右下角弹广告flash helper service解决教程

热门文章

  1. 单片机矩阵消抖延时c语言,单片机矩阵按键定时器消抖程序源码
  2. 帆软获取上月的第一天与最后一天_《原神》岩港打工第一天怎么玩 岩港打工第一天玩法攻略...
  3. dev可以运行mysql文件夹_Linux查看mysql 安装路径和运行路径
  4. mysql新加不了数据库_MySQL数据库之mysql增加新用户无法登陆解决方法
  5. 问题 A: 约瑟夫问题(普及第一关模拟)
  6. [Java基础]反射获取成员方法并使用练习
  7. hdu2602 Bone Collector-01背包问题
  8. 数据结构与算法--数组中出一次的数字
  9. Spring集成Mybatis配置映射文件方法详解
  10. 分布式缓存——缓存与数据库数据一致性