Jzoj3898 树的连通性
来源:互联网 发布:钢结构强度校核软件 编辑:程序博客网 时间:2024/06/05 11:05
题意:给一棵树,每次删边或者询问连通性,强制在线
其实这题做法很多嘛,简单说一下
一眼看过去肯定是LCT啦,于是马上开始打
打到一半发现似乎不用LCT?好像树剖也可以嘛
结果发现树剖也不用,直接一个dfs序就可以了嘛
用线段树维护每个点能到达的最远的祖先,删边的时候将整个区间覆盖即可
注意,对于在子树中已经断开的节点不要再覆盖,可以记录每个节点深度
#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include<stdio.h>#include<string.h>#include<algorithm>#define N 200010using namespace std;struct Edge{ int v,nt; } G[N<<1];int h[N],l[N],r[N],s[N<<2],v[N],n,m,cnt=0,clk=0,d[N];inline void adj(int x,int y){ G[++cnt]=(Edge){y,h[x]}; h[x]=cnt; }void dfs(int x,int p){l[x]=++clk; d[x]=d[p]+1;for(int v,i=h[x];i;i=G[i].nt)if((v=G[i].v)!=p) dfs(v,x);r[x]=clk;}inline void pd(int x){ //防止重复覆盖if(s[x]){int &ls=s[x<<1],&rs=s[x<<1|1];if(d[ls]<d[s[x]]) ls=s[x];if(d[rs]<d[s[x]]) rs=s[x];s[x]=0; }}void update(int l,int r,int x,int L,int R,int k){if(L<=l && r<=R){ if(!s[x]||d[s[x]]<d[k]) s[x]=k; return; }pd(x); int m=l+r>>1;if(L<=m) update(l,m,x<<1,L,R,k);if(m<R) update(m+1,r,x<<1|1,L,R,k);}int query(int l,int r,int x,int k){if(l==r) return s[x];pd(x); int m=l+r>>1;if(k<=m) return query(l,m,x<<1,k);else return query(m+1,r,x<<1|1,k);}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%d",v+i);for(int x,y,i=1;i<n;++i){scanf("%d%d",&x,&y);adj(x,y); adj(y,x);}dfs(1,0); int lst=0; s[1]=1;for(int o,a,b;m--;){scanf("%d%d%d",&o,&a,&b);a^=lst; b^=lst;if(o==1){if(l[b]>l[a]) a=b;update(1,n,1,l[a],r[a],a);} else if(o==2){if(query(1,n,1,l[a])==query(1,n,1,l[b]))printf("%d\n",lst=v[a]*v[b]);else printf("%d\n",lst=v[a]+v[b]);} else v[a]=b;}}
阅读全文
1 0
- Jzoj3898 树的连通性
- 图的连通性小结
- 图的连通性
- 判断图的连通性
- 数据结构---图的连通性
- 【图的连通性】poj2117Electricity
- 图的连通性判断
- 判断图的连通性
- 判断图的连通性
- 图的连通性问题
- 数据结构的连通性问题
- 图的连通性问题
- 图的连通性问题
- 图的连通性问题
- 图的连通性判断
- Calico 的默认连通性
- Jzoj3899 逻辑的连通性
- 图的连通性问题
- 存储过程的优缺点
- Python数据分析(一): ipython 技巧!
- 10.3考试 少女觉 贪心
- 线性表(一)
- 关于如何更好地使用Github的一些建议
- Jzoj3898 树的连通性
- HDOJ2049
- UI自动化测试(二)浏览器操作及对元素的定位方法(xpath定位和css定位详解)
- 《MySQL入门很简单》学习笔记(2)之第2章Windows平台下安装与配置MySQL(关键词:数据库/MySQL/Windows)
- 线性表(二)
- < 笔记 > Python
- 网易2018校招内推编程题集合
- 【转】MongoDB基本命令使用
- 斐波那契堆是一系列具有最小堆序的有根树的集合