bzoj 3083
bzoj 3083 树链剖分,换根
对于一颗树有以下操作
1.确定x为根,2.将u到v的简单路径上的数全改成c,3.询问当前以x为根的子树中的节点最小权值。
如果没有操作1:树链剖分很明显。
于是考虑换根对结果的影响:
Case 1:root=x 结果是全树最小值。
Case 2: root!=x且lca(root,x)=x 利用倍增求出x的孩子中是root祖先的那一个设为y,结果是全树除子树y以外最小值。
Case 3:lca(root,x)!=x 结果无影响,即子树x的最小值。
简述:树链剖分&lca/倍增
#include<bits/stdc++.h>
using namespace std;
const int inf=;
struct tr{int dep,sz,hs,tp,ls,rs,fa[];}t[];
struct st{int mn,tg;}seg[];
vector<int>g[];
int n,m,ans,rt,tt,v[],ps[];
void dfs1(int x,int p,int d)
{
t[x].fa[]=p;t[x].dep=d;t[x].hs=;t[x].sz=;
for(int i=;i<=;i++)if(t[x].dep>=<<i)t[x].fa[i]=t[t[x].fa[i-]].fa[i-];
for(int i=;i<g[x].size();i++)if(g[x][i]!=p)
{
dfs1(g[x][i],x,d+);
if(t[t[x].hs].sz<t[g[x][i]].sz)t[x].hs=g[x][i];
}
}
void dfs2(int x,int p)
{
t[x].tp=p;t[x].ls=ps[x]=++tt;
if(t[x].hs)dfs2(t[x].hs,p);
for(int i=;i<g[x].size();i++)if(g[x][i]!=t[x].fa[]&&g[x][i]!=t[x].hs)dfs2(g[x][i],g[x][i]);
t[x].rs=tt;
}
void up(int x){seg[x].mn=min(seg[x<<].mn,seg[x<<|].mn);}
void down(int x){seg[x<<]=seg[x<<|]=seg[x];seg[x].tg=;}
void build(int x,int l,int r)
{
if(l==r){seg[x].mn=v[l];return;}
int md=l+r>>;build(x<<,l,md);build(x<<|,md+,r);up(x);
}
void upd(int x,int l,int r,int tl,int tr,int c)
{
if(tl<=l&&r<=tr){seg[x]=(st){c,c};return;}
if(seg[x].tg)down(x);
int md=l+r>>;
if(tl<=md)upd(x<<,l,md,tl,tr,c);
if(tr>md)upd(x<<|,md+,r,tl,tr,c);
up(x);
}
void qry(int x,int l,int r,int tl,int tr)
{
if(tl<=l&&r<=tr){ans=min(ans,seg[x].mn);return;}
if(seg[x].tg)down(x);
int md=l+r>>;
if(tl<=md)qry(x<<,l,md,tl,tr);
if(tr>md)qry(x<<|,md+,r,tl,tr);
}
int gtlca(int x,int y)
{
if(t[x].dep<t[y].dep)swap(x,y);
int sub=t[x].dep-t[y].dep;
for(int i=;i<=;i++)if(sub&(<<i))x=t[x].fa[i];
for(int i=;i>=;i--)if(t[x].fa[i]!=t[y].fa[i])x=t[x].fa[i],y=t[y].fa[i];
if(x==y)return x;else return t[x].fa[];
}
int gtanc(int x,int d){for(int i=;i<=;i++)if(d&(<<i))x=t[x].fa[i];return x;}
void modify(int x,int y,int c)
{
int f1=t[x].tp,f2=t[y].tp;
while(f1!=f2)
{
if(t[f1].dep<t[f2].dep){swap(f1,f2);swap(x,y);}
upd(,,n,ps[f1],ps[x],c);
x=t[f1].fa[];f1=t[x].tp;
}
if(t[x].dep>t[y].dep)swap(x,y);
upd(,,n,ps[x],ps[y],c);
}
void query(int x)
{
int lca,v;
lca=gtlca(rt,x);
if(rt==x)printf("%d\n",seg[].mn);
else
{
ans=inf;
if(lca!=x)qry(,,n,t[x].ls,t[x].rs);
else
{
v=gtanc(rt,t[rt].dep-t[x].dep-);
if(t[v].ls>)qry(,,n,,t[v].ls-);
if(t[v].rs<n)qry(,,n,t[v].rs+,n);
}
printf("%d\n",ans);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}
dfs1(,,);
dfs2(,);
for(int i=;i<=n;i++)scanf("%d",&v[ps[i]]);
build(,,n);
scanf("%d",&rt);
for(int i=;i<=m;i++)
{
int kd,x,y,c;scanf("%d",&kd);
if(kd==)scanf("%d",&rt);
else if(kd==){scanf("%d%d%d",&x,&y,&c);modify(x,y,c);}
else if(kd==){scanf("%d",&x);query(x);}
}
return ;
}
bzoj 3083的更多相关文章
- BZOJ 3083 - 遥远的国度
原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3083 说话间又一个多月过去了..该来除除草了,每天都是训练.没效率,训练.没效率..省选考 ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增
今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 128 ...
- BZOJ 3083 遥远的国度 树链剖分
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 797 Solved: 181[Submit][Status] Descrip ...
- bzoj 3083 树链剖分
首先我们先将树提出一个根变成有根树,那么我们可以通过树链剖分来实现对于子树的最小值求解,那么按照当前的根和询问的点的相对位置关系我们可以将询问变成某个子树和或者除去某颗子树之后其余的和,前者直接询问区 ...
- bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了…… O( nlog ...
- BZOJ 3083 遥远的国度(树链剖分+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3083 [题目大意] 链修改,子树最小值查询和换根操作 [题解] 树链剖分练习题. [代 ...
- bzoj 3083 遥远的国度 —— 树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可. 代码如下: #inclu ...
- 【BZOJ 3083】遥远的国度
这道题很简单的连剖+分类讨论,但是SDOI Round2要来了,不会手动栈怎么办呢?只好用一下这道题练习一下手动栈了,结果调了一天多QwQ 链剖的第一个dfs用bfs水过就行,但是我自以为是地把倍增写 ...
随机推荐
- ABAP 创建function model 返回参数为内表类型
1:通过T-CODE se11 创建一个structure ZSTRU2. 2: 创建一个table type, 表名 ZTAB1. 3: 表的row type 选择 ZSTRU2 4: ...
- Scala之隐式转换
概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...
- 多态使用时,父类多态时需要使用子类特有对象。需要判断 就使用instanceof
instanceof:通常在向下转型前用于健壮性的判断,判断是符合哪一个子类对象 package Polymorphic; public class TestPolymorphic { public ...
- 使用 Oracle Data Access Components连接oracel
使用微软自带的oracle连接类,在framework4.0中被标识为弃用,强行用它开发了Winform程序,发布放到XP上提示: Error System.Data.OracleClient req ...
- Notes for Neural Network Methods for Natural Language Processing
什么是深度学习? 一种机器学习算法,based on [多层][非线性变换]的[神经网络]结构 优点:可以使用 低维 稠密 连续 的向量表示不同粒度的语言单元, 还可以使用循环.卷积.递归等神经网 ...
- 收藏住:金融&电商类原型模板重磅来袭,免费使用!
经常有很多产品经理和设计师想要各行业的产品原型模板,可以直接下载使用.现在分享下一个资源渠道:墨刀的原型模板. 上新了金融类和电商类的主要App设计原型,可以直接免费使用,具体包括: 金融类 招商银行 ...
- 2sum,3sum,4sum,ksum
1. 2sum 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...
- jmeter BeanShell断言(一)
原文地址https://blog.csdn.net/lijing742180/article/details/81157947 原文地址https://blog.csdn.net/zailushang ...
- DataGridView控件用法一:数据绑定
使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据. 将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可.在绑 ...
- idea如何整理代码格式
1.先CRTL + A来选中需要整理的代码块.当然CRTL + A代表选中一个文件的所有代码. 2.然后CRTL + ALT + L,对,就是要记住这个快捷键.