【JZOJ 4604】【BZOJ 4551】树
2016-07-11 16:52
204 查看
Description
Solution
一道树链剖分裸题,复杂度:O(nlog2(n)2)
Code
#include<iostream> #include<cstdio> #include<cstdlib> #define fo(i,a,b) for(int i=a;i<=b;i++) #define efo(i,q) for(int i=A[q];i;i=B[i][0]) #define iff() if(B[i][1]!=fa) using namespace std; const int N=100500,maxlongint=2107483640; int read(int &n) { char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n; } int n,m,ans; int B[2*N][2],A ,B0=1; struct qqww {int s,lt,fa,zx;}a ; int zx ,b[N*3]; void link(int q,int w) { B[++B0][0]=A[q],A[q]=B0,B[B0][1]=w; B[++B0][0]=A[w],A[w]=B0,B[B0][1]=q; } int dfs1(int q,int fa) { a[q].fa=fa;a[q].s=1; efo(i,q)iff() a[q].s+=dfs1(B[i][1],q); return a[q].s; } void dfs2(int q,int fa,int lt) { if(!lt)lt=q;a[q].lt=lt;zx[a[q].zx=++zx[0]]=q; int mx=0; efo(i,q)iff()if(a[mx].s<a[B[i][1]].s)mx=B[i][1]; if(mx)dfs2(mx,q,lt); efo(i,q)iff()if(B[i][1]!=mx)dfs2(B[i][1],q,0); } void change(int l,int r,int e,int l1) { if(l==r){b[e]=l;return;} int t=(l+r)/2; if(l1<=t)change(l,t,e*2,l1); else change(t+1,r,e*2+1,l1); if(b[e*2+1])b[e]=b[e*2+1]; else b[e]=b[e*2]; } int find(int l,int r,int e,int l1,int r1) { if(l1<=l&&r<=r1)return b[e]; int t=(l+r)/2; if(r1<=t)return find(l,t,e*2,l1,r1); else if(t<l1)return find(t+1,r,e*2+1,l1,r1); else { int s=find(t+1,r,e*2+1,t,r1); if(s)return s; return find(l,t,e*2,l1,t); } } int search(int q) { while(q) { int t=a[q].lt; int s=find(1,n,1,a[t].zx,a[q].zx); if(s)return zx[s]; q=a[t].fa; } return 1; } int main() { int q,w,m_; read(n),read(m_); fo(i,1,n-1)read(q),read(w),link(q,w); dfs1(1,0); dfs2(1,0,0); change(1,n,1,1); while(m_--) { char ch=' ';while(ch!='Q'&&ch!='C')ch=getchar(); read(q); if(ch=='C')change(1,n,1,a[q].zx); else printf("%d\n",search(q)); } return 0; }
相关文章推荐
- 20160711笔记
- c 二分查找
- File数据存储
- Android APK打包流程
- javascript 中的 this 分类详解
- 我们为什么要使用 href="javascript:void(0)"
- java运行原理
- Palindrome Linked List
- Git和SVN之间的五个基本区别
- Ubuntu 14.04 上安装 CUDA 7.5/8.0 超详细教程
- 逆地址解析
- Android通过注解初始化View
- python的基本知识
- 用美图秀秀(微软调色版)生成的R分量为255的图片在MATLAB和OpenCV中R分量为254
- 初级Java开发电脑环境配置
- POJ 2891 Strange Way to Express Integers
- 【例题】【线段树】lazy
- RxJava 详解
- swiper教程——swiper的基础使用(十九)
- JavaScript强化教程——jQuery - 获得内容和属性