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 ...
随机推荐
- SpringMVC spring-servlet.xml配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Asp.Net mvc4 项目 在vs中调试正常 在IIS发布后连接oracle数据库时提示数据库连接关闭
解决办法: 1.打开iis,找到发布的程序 2.右键单击“TAKANAPP” 从右键菜单选择“管理应用程序”--“高级设置....” 在打开的高级设置 面板 查看对应的应用程序池 名称 3.设置应用 ...
- ArcGIS Scalebar 比例尺
说明.这篇博文的示例代码 地图充满body arcgis api for javascript iis怎么离线部署 请参考我前面的博文 1.运行效果 3.HTML代码 <!DOCTYPE htm ...
- 监控httpd的shell脚本
#!/bin/bash # Apache httpd进程监控shell # 如果你在使用RHEL / CentOS / Fedora Linux,使用这个重启命令 RESTART="/sbi ...
- l如何把SQLServer表数据导出CSV文件,并带列名
http://jingyan.baidu.com/article/4b07be3c466b5d48b280f37f.html 微信公众号:
- Oracle视图传递参数
在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现. oracle package: oracle package是oracle包,是一组相关过程.函 ...
- Android Studio 1.1 使用介绍及导入 jar 包和第三方依赖库
导入 jar 包 导入 jar 包的方式非常简单,就是在项目中的 libs 中放入你需要导入的 jar 包,然后右键你的 jar 文件,选择“add as a library”即可在你的项目中使用这个 ...
- IONIC3 打包安卓apk详细过程(大量图文)
经历三天的踩坑,跳坑,相信绝大多数的问题都已经覆盖到了,请仔细按照流程来对照操作及检查. 1.基本依赖环境 nodejs环境 (作为一个前端相信你已经有了) 最好提前配置好node的环境变量,便于全 ...
- GPS数据转换为OneNet需要的数据
GPS的数据格式是DDMM.MMMMMM 获取到的GPS帧数据比如是:$GNRMC,112317.000,A,3438.1633,N,11224.4992,E,0.19,186.95,240916,, ...
- QT发布的EXE打包压缩成单文件
Enigma virtual box 是免费的软件虚拟化工具,它可以将多个文件封装到您的应用程序主文件,这样您的软件就可以制作成为单文件的绿色软件. enigma virtual box 支持所有类型 ...