bzoj 3083 遥远的国度 —— 树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083
换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
typedef long long ll;
int const xn=1e5+;
int n,m,hd[xn],ct,to[xn<<],nxt[xn<<],rt;
int tim,dfn[xn],fa[xn],siz[xn],son[xn],dep[xn],top[xn],id[xn];
ll a[xn],mn[xn<<],lzy[xn<<],inf=1e17;
ll rd()
{
ll ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
ll minn(ll x,ll y){return x<y?x:y;}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void dfs(int x,int ff)
{
fa[x]=ff; dep[x]=dep[ff]+; siz[x]=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff)continue;
dfs(u,x); siz[x]+=siz[u];
if(siz[u]>siz[son[x]])son[x]=u;
}
}
void dfsx(int x)
{
dfn[x]=++tim; id[tim]=x;
if(son[x])top[son[x]]=top[x],dfsx(son[x]);
for(int i=hd[x],u;i;i=nxt[i])
if((u=to[i])!=fa[x]&&u!=son[x])top[u]=u,dfsx(u);
}
void build(int x,int l,int r)
{
if(l==r){mn[x]=a[id[l]]; return;}//id!!
build(ls,l,mid); build(rs,mid+,r);
mn[x]=minn(mn[ls],mn[rs]);
}
void turn(int x,ll v){mn[x]=v; lzy[x]=v;}
void pushdown(int x)
{
if(!lzy[x])return;
turn(ls,lzy[x]); turn(rs,lzy[x]);
lzy[x]=;
}
void update(int x,int l,int r,int L,int R,ll v)
{
if(l>=L&&r<=R){turn(x,v); return;}
pushdown(x);
if(mid>=L)update(ls,l,mid,L,R,v);
if(mid<R)update(rs,mid+,r,L,R,v);
mn[x]=minn(mn[ls],mn[rs]);
}
ll query(int x,int l,int r,int L,int R)
{
if(L>R)return inf;
if(l>=L&&r<=R)return mn[x];
pushdown(x); ll ret=inf;
if(mid>=L)ret=minn(ret,query(ls,l,mid,L,R));
if(mid<R)ret=minn(ret,query(rs,mid+,r,L,R));
return ret;
}
void change(int x,int y,ll v)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
update(,,n,dfn[top[x]],dfn[x],v); x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
update(,,n,dfn[y],dfn[x],v);
}
int find(int x,int y)//y in x
{
while(top[y]!=top[x])
{
if(fa[top[y]]==x)return top[y];
y=fa[top[y]];
}
return son[x];
}
ll ask(int x)
{
if(x==rt)return query(,,n,,n);
if(dfn[rt]<dfn[x]||dfn[rt]>=dfn[x]+siz[x])
return query(,,n,dfn[x],dfn[x]+siz[x]-);
int y=find(x,rt);
return minn(query(,,n,,dfn[y]-),query(,,n,dfn[y]+siz[y],n));
}
int main()
{
n=rd(); m=rd();
for(int i=,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x);
dfs(,); top[]=; dfsx();
for(int i=;i<=n;i++)a[i]=rd();
build(,,n);
rt=rd(); ll z;
for(int i=,opt,x,y;i<=m;i++)
{
opt=rd(); x=rd();
if(opt==)rt=x;
if(opt==)y=rd(),z=rd(),change(x,y,z);
if(opt==)printf("%lld\n",ask(x));
}
return ;
}
bzoj 3083 遥远的国度 —— 树链剖分的更多相关文章
- BZOJ 3083 遥远的国度 树链剖分
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 797 Solved: 181[Submit][Status] Descrip ...
- BZOJ 3083 遥远的国度(树链剖分+LCA)
Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...
- BZOJ 3083: 遥远的国度(树链剖分+DFS序)
可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...
- BZOJ 3083 遥远的国度 树链剖分+线段树
有换根的树链剖分的裸题. 在换根的时候注意讨论. 注意数据范围要开unsigned int或longlong #include<iostream> #include<cstdio&g ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了…… O( nlog ...
- BZOJ 3083 遥远的国度 树链剖分+脑子
唉..又调了半天QWQ..为何读入挂了.....莫非读入是反着的????据ywy学长所言如是...OvO震惊 这啥骚题啊...还要换根...不过清明讲过...(然鹅我现在才做... 先随便选个点(比如 ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- 【bzoj3083】遥远的国度 树链剖分+线段树
题目描述 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn ...
随机推荐
- 九度OJ 1340:小A的计算器 (进制转换)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:735 解决:202 题目描述: 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-2 ...
- 1.BeanFactory解析
package org.springframework.beans.factory; import org.springframework.beans.BeansException; import o ...
- 物理cpu和逻辑cpu
1 物理cpu 插槽里面实际插入的cpu的个数. 通过不重复的physical id可以获取实际的物理cpu的个数. 2 逻辑cpu cat /proc/info processor 1 proces ...
- What is the difference between iterations and epochs in Convolution neural networks?
https://stats.stackexchange.com/questions/164876/tradeoff-batch-size-vs-number-of-iterations-to-trai ...
- Random Fourier Features
K-DSN 深度堆叠网络 Random Features for Large-Scale Kernel Machines To accelerate the training of kernel ma ...
- 我的Android进阶之旅------>启动Activity的标准Action和标准Category
Android内部提供了大量标准的Action和Category常量. 除了参考本文外,您还可以参考了以下链接: http://developer.android.com/reference/andr ...
- 牛客小白月赛1 D 多项式乘法 【循环】
题目链接 https://www.nowcoder.com/acm/contest/85/D 思路 因为数据范围较小 ,所以 可以直接 一个一个乘 AC代码 #include <cstdio&g ...
- 20145229吴姗珊 《Java程序设计》小总结
20145229吴姗珊 <Java程序设计>小总结 教材学习内容总结 由于今天考试考到了操作题,根本无从下手,然后才意识到原来之前的学习都是蜻蜓点水,一味的把学习建立在给老师学,为家长学的 ...
- 剑指offer之 栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列.假设压入栈的所有数字均不相等.例如序列1/2/3/4/5是某栈的压栈序列,序列4/5/3/2/1是该压栈序 ...
- org.eclipse.core.resources.bak文件导致MyEclipse每次关闭时无法保存文件
MyEclipse关闭时提示如下信息 Problems occurred while trying to save the state of the workbench. Internal Error ...