一无聊就找树剖写

题意:一颗带点权的树,三种操作:1.换根 2.链赋值 3.查询子树最小值


如果没有换根的话直接就是裸的树剖了,对于换根的操作我们可以分类讨论。

1.如果查询的$x$就是根,那答案就是整棵树的最小值。

2.如果以1为根的dfs序中,根在$x$的子树之外,那很明显$x$的子树还是原来的子树。

3.如果以1为根的dfs序中,根在$x$的子树里面的话,画个图就能发现,找到$x$的孩子中作为根的父亲那个点,答案就是整棵树把整个点的子树去掉就行了。

其他地方跟树剖没什么区别…

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lint;
const int N=100005;
const lint INF=(1ll<<32);
inline lint read()
{
lint s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return s*f;
}
struct edge
{
int to,nxt;
}edges[N<<1];
int n,m,cnt,rot,tot;
int head[N<<1],son[N],size[N],dep[N],top[N],dl[N],dr[N],rk[N],fa[N];
lint tr[N<<2],tag[N<<2],v[N]; #define lson (o<<1)
#define rson (o<<1|1)
inline void push_up(int o)
{
tr[o]=min(tr[lson],tr[rson]);
}
inline void push_down(int o)
{
if(tag[o]==-1)return;
tag[lson]=tag[rson]=tag[o];
tr[lson]=tr[rson]=tag[o];
tag[o]=-1;
}
inline void build(int o,int l,int r)
{
tag[o]=-1;
if(l==r)
{
tr[o]=v[rk[l]];
return;
}int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r);
push_up(o);
}
inline void modify(int o,int l,int r,int ql,int qr,lint val)
{
if(ql<=l&&r<=qr)
{
tag[o]=tr[o]=val;
return;
}push_down(o);
int mid=(l+r)>>1;
if(mid>=ql)modify(lson,l,mid,ql,qr,val);
if(mid+1<=qr)modify(rson,mid+1,r,ql,qr,val);
push_up(o);
}
inline lint query(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return tr[o];
push_down(o);
int mid=(l+r)>>1;lint res=INF;
if(mid>=ql)res=min(res,query(lson,l,mid,ql,qr));
if(mid+1<=qr)res=min(res,query(rson,mid+1,r,ql,qr));
return res;
} #undef lson
#undef rson
inline void addEdge(int u,int v)
{
edges[++cnt]=(edge){v,head[u]};
head[u]=cnt;
}
#define cur edges[i].to
inline void dfs1(int x)
{
size[x]=1;
for(register int i=head[x];i;i=edges[i].nxt)
if(cur!=fa[x])
{
fa[cur]=x;dep[cur]=dep[x]+1;
dfs1(cur);size[x]+=size[cur];
if(size[son[x]]<size[cur])son[x]=cur;
}
}
inline void dfs2(int x,int t)
{
top[x]=t;dl[x]=++tot;rk[tot]=x;
if(son[x])dfs2(son[x],t);
for(register int i=head[x];i;i=edges[i].nxt)
if(cur!=fa[x]&&cur!=son[x])dfs2(cur,cur);
dr[x]=tot;
}
#undef cur
inline void modify_link(int a,int b,int val)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
modify(1,1,n,dl[top[a]],dl[a],val);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
modify(1,1,n,dl[a],dl[b],val);
}
inline lint query_tree(int x)
{
if(rot==x)return query(1,1,n,1,n);
if(dl[x]<=dl[rot]&&dl[rot]<=dr[x])
{
int y;
for(register int i=head[x];i;i=edges[i].nxt)
if(dl[edges[i].to]<=dl[rot]&&dl[rot]<=dr[edges[i].to])
{
y=edges[i].to;
break;
}
return min(query(1,1,n,1,dl[y]-1),query(1,1,n,dr[y]+1,n));
}else
{
return query(1,1,n,dl[x],dr[x]);
}
}
int main()
{
n=read();m=read();rot=1;
for(register int i=1;i<n;i++)
{
int u,v;u=read();v=read();
addEdge(u,v);addEdge(v,u);
}
for(register int i=1;i<=n;i++)v[i]=read();
rot=read();
dfs1(1);dfs2(1,1);build(1,1,n);
for(register int i=1;i<=m;i++)
{
int op,x,y,val;op=read();
if(op==1)
{
rot=read();
}else if(op==2)
{
x=read();y=read();val=read();
modify_link(x,y,val);
}else
{
x=read();
printf("%lld\n",query_tree(x));
}
}
}

最新文章

  1. HDU2586How far away ?
  2. centos7配置wordpress
  3. 极客DIY:如何用Siri与树莓派“交互”
  4. javascript_获取浏览器属性
  5. 2016.7.7 计算机网络复习要点第四章之网际协议IP
  6. HDU 4000 Fruit Ninja 树状数组 + 计数
  7. SharePoint webpart中悬浮窗口的webconfig路径
  8. lucene做简单的文件索引
  9. 懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法
  10. Docker使用 Supervisor 来管理进程
  11. TCP协议的性能评测工具 — Tcpdive开源啦
  12. SoapUI Pro Project Solution Collection-Test Step Object
  13. Navicat Premium和Navicat for MySQL哪个好用?
  14. docker:一个支持django的dockerfile
  15. 解决工作中遇到的一个&quot;打开,保存&quot;文件框的bug的过程
  16. Codeforces 670D1. Magic Powder - 1 暴力
  17. BZOJ3996 TJOI2015线性代数
  18. StartUML-类图
  19. zoj3820 树的直径+二分
  20. Unreal开发HTC Vive程序,开启VR编辑模式

热门文章

  1. CorelDRAW X7 X8 2017 2018是什么关系?
  2. 循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计
  3. And Or IN Not操作符
  4. Flink-1-状态化流处理概述
  5. yii2.0 ActiveForm 单选框与复选框使用
  6. Java反射——java.lang.Class和类的加载
  7. oracle 流程控制句式
  8. Jmeter测试Websocket接口
  9. 关于Django的序列化问题。serializers
  10. moviepy音视频开发:音频剪辑基类AudioClip详解