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 ...
随机推荐
- Jeecms 防xss处理原理
Web.xml配置过滤器,并指的要过滤和替换的字符: 过滤器的filter方法,对传入的HttpServletRequest对象进行了修改 具体过滤在XssHttpServletRequestWrap ...
- 转 开启“大数据”时代--大数据挑战与NoSQL数据库技术 iteye
一直觉得“大数据”这个名词离我很近,却又很遥远.最近不管是微博上,还是各种技术博客.论坛,碎碎念大数据概念的不胜枚举. 在我的理解里,从概念理解上来讲,大数据的目的在于更好的数据分析,否则如此大数据的 ...
- 多图切换jQuery图片滑块插件
在线演示 本地下载
- jQuery悬浮焦点图宽屏
在线演示 本地下载
- java 遍历数组的几种方式
本文总结自: https://www.cnblogs.com/hellochennan/p/5373186.html 1. 传统方式 非常简单的for循环 int[] a = {1, 2, 3, 4} ...
- C语言中的位操作(16)--计算二进制数字尾部连续0的数目
本篇文章介绍计算二进制数字尾部连续0的数目的相关算法,例如:v=(1101000)2,该数尾部连续0的数目=3 方法1:线性时间算法 unsigned int v; // 需要计算的目标整数 int ...
- Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树
题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...
- 分享知识-快乐自己:Mybatis 基础动态语句
目录: User: package mlq.bean; /** * 用户实体类 */ public class User { private Integer uId; private String u ...
- Python基础-set集合操作
set集合,是一个无序且不重复的元素集合.定义方式类似字典使用{}创建 目前我们学过的数据类型: 1.字符串(str),2.整型(int),3.浮点型(float),4,列表(list) 5.元组(t ...
- POJ 2421 Constructing Roads(Kruskal算法)
题意:给出n个村庄之间的距离,再给出已经连通起来了的村庄.求把所有的村庄都连通要修路的长度的最小值. 思路:Kruskal算法 课本代码: //Kruskal算法 #include<iostre ...