BZOJ 3083 遥远的国度 树链剖分+脑子
唉。。又调了半天QWQ。。为何读入挂了。。。。。莫非读入是反着的????据ywy学长所言如是。。。OvO震惊
这啥骚题啊、、、还要换根、、、不过清明讲过、、、(然鹅我现在才做、、、
先随便选个点(比如选1) 树剖板子一样搞一搞
1操作 就直接改root变量的值
2操作 线段树上改 换根不影响。。
3操作 分成三种情况 :
1.rt = u 整个树的min就是ans
2. lca(rt,u) != u 求u子树的min就好了 换根不影响
3. lca(rt,u) = u 找一下rt在u的子树里,求这个子树的补集的min就好了
比如rt在以v为根的u的子树中,那么如果dfn [ v ] > 1 先求 1到dfn [ v ] - 1的 min , (如果dfn [ v ]+sz[ v ] <= n) 就再求一下 dfn[v]+sz[v] 到 n 的min
- #include<cstdio>
- #include<iostream>
- #define R register int
- #define ls (tr<<1)
- #define rs (tr<<1|1)
- using namespace std;
- const int M=,Inf=0x7fffffff;
- inline int g() {
- R ret=; register char ch; while(!isdigit(ch=getchar()));
- do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
- }
- int n,m,cnt,num,rt;
- int vr[M<<],nxt[M<<],fir[M],w[M],top[M],son[M],pre[M],sz[M],d[M],dfn[M],rw[M];
- int mn[M<<],tg[M<<];
- inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
- inline void dfs(int u) { sz[u]=; R mx=;
- for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
- if(d[v]) continue; d[v]=d[u]+,pre[v]=u; dfs(v);
- sz[u]+=sz[v]; if(sz[v]>mx) son[u]=v,mx=sz[v];
- }
- }
- inline void dfs2(int u,int tp) { dfn[u]=++num,rw[num]=u,top[u]=tp;
- if(son[u]) dfs2(son[u],tp);
- for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
- if(v!=son[u]&&v!=pre[u]) dfs2(v,v);
- }
- }
- inline void build(int tr,int l,int r) {
- if(l==r) {mn[tr]=w[rw[l]]; return ;} R md=l+r>>;
- build(ls,l,md),build(rs,md+,r); mn[tr]=min(mn[ls],mn[rs]);
- }
- inline void spread(int tr) { if(tg[tr])
- tg[ls]=tg[tr],mn[ls]=tg[tr],
- tg[rs]=tg[tr],mn[rs]=tg[tr],tg[tr]=;
- }
- inline void update(int tr,int l,int r,int LL,int RR,int inc) {
- if(LL<=l&&r<=RR) {mn[tr]=inc; tg[tr]=inc; return ;} spread(tr); R md=l+r>>;
- if(LL<=md) update(ls,l,md,LL,RR,inc); if(RR>md) update(rs,md+,r,LL,RR,inc);
- mn[tr]=min(mn[ls],mn[rs]);
- }
- inline int query(int tr,int l,int r,int LL,int RR) {
- if(LL<=l&&r<=RR) return mn[tr]; spread(tr); R md=l+r>>,ret=Inf;
- if(LL<=md) ret=min(ret,query(ls,l,md,LL,RR)); if(RR>md) ret=min(ret,query(rs,md+,r,LL,RR));
- return ret;
- }
- inline int lca(int u,int v) {
- while(top[u]!=top[v]) {
- if(d[top[u]]<d[top[v]]) swap(u,v); u=pre[top[u]];
- } return d[u]>d[v]?v:u;
- }
- inline void change(int u,int v,int inc) {
- while(top[u]!=top[v]) {
- if(d[top[u]]<d[top[v]]) swap(u,v);
- update(,,n,dfn[top[u]],dfn[u],inc);
- u=pre[top[u]];
- } if(dfn[u]>dfn[v]) swap(u,v);
- update(,,n,dfn[u],dfn[v],inc);
- }
- inline int getmn(int u) { R v,ret=Inf;
- if(u==rt) return mn[];
- R l=lca(u,rt);
- if(l!=u) return query(,,n,dfn[u],dfn[u]+sz[u]-);
- else for(R i=fir[u];i;i=nxt[i]) if(lca(vr[i],rt)==vr[i]) {v=vr[i]; break;}
- if(dfn[v]>) ret=min(ret,query(,,n,,dfn[v]-));
- if(dfn[v]+sz[v]<=n) ret=min(ret,query(,,n,dfn[v]+sz[v],n)); return ret;
- }
- signed main() {
- n=g(),m=g();
- for(R i=,u,v;i<n;++i) u=g(),v=g(),add(u,v),add(v,u);
- for(R i=;i<=n;++i) w[i]=g(); d[]=; rt=g(); dfs(); dfs2(,);
- build(,,n);
- for(R i=;i<=m;++i) {
- R k=g(),u=g(),v,inc;
- if(k==) rt=u;
- else if(k==) //change(u,g(),g());
- v=g(),inc=g(),change(u,v,inc);
- else if(k==) printf("%d\n",getmn(u));
- }
- }
2019.04.22
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 换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可. 代码如下: #inclu ...
- bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了…… O( nlog ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- 【bzoj3083】遥远的国度 树链剖分+线段树
题目描述 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要zcwwzdjn ...
随机推荐
- js调试的一点小知识
1.如果想要js代码被XHTML和HTML解析,就可以使用如下方式 <script type="text/javascript"> //<![CDATA[ fun ...
- OpenCV 官方工程报错(1) Couldn't load mixed_sample from loader
openCV/OpenCV-android-sdk/samples/tutorial-2-mixedprocessing 工程 - ::): Trying to get library list - ...
- 安装vs2012以后 sql2008不能使用解决办法
出现的错误 (1) 打开控制面板,找到卸载程序,把”MicrosoftSQL Server 2013(2012) Express LocalDB”卸载掉,然后打开SQL Server 配置管理器,就会 ...
- MS_SQL_获取字符串最后出现的字符串及位置
一.如:'6.7.8.2.3.4.x'得到最后一个'.'后面的字符串: declare @str1 varchar(50) set @str1='6.7.8.2.3.4.x' select REV ...
- od命令 查看二进制文件
od命令用于输出文件的八进制.十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. 以数值进制格式输出:od [选项] 文件 od -d 文件 --十进制输 ...
- android中finish和system.exit方法退出的区别
finish只是将此activity推向后台,并没有释放资源. 而system.exit则是杀死进程,会释放资源
- day17-jdbc 7.Statement介绍
SQL语句:DML.DQL.DCL.DDL.DML和DQL是用的最多的.DCL和DDL用的很少. 程序员一般是操作记录,创建一表很少. package cn.itcast.jdbc; import c ...
- python 爬虫 常见安全措施
1.隐含输入字段值: 1.1首先采集表单所在页面上生成的随机变量,然后再提交到表单处理页面. 2.避免蜜罐 3.用远程服务器:洋葱路由(The Onion Router)网络.PySocks 是一个非 ...
- ==, equals, hashcode的理解
一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是判断对象实例是否物理相等: equals(): 对比两个对象实例是否相等. 当 ...
- JavaPersistenceWithMyBatis3笔记-第1章-001
一.介绍 1.项目结构 2.数据库结构 二.代码 1.Mapper package com.mybatis3.mappers; import java.util.List; import com.my ...