网站建设速度如何解决,销售易app官网下载,好大夫在线医生免费咨询,塘沽做网站比较好的正题
题目链接:https://www.luogu.com.cn/problem/P4092 题目大意 nnn个点的树要求支持以下操作
给一个点打上标记求一个节点最近的打上了标记的祖先 解题思路
就是求深度最大的打上了标记的祖先#xff0c;先跑一遍dfsdfsdfs序#xff0c;然后对于修改操作就在线段树上整…正题
题目链接:https://www.luogu.com.cn/problem/P4092 题目大意
nnn个点的树要求支持以下操作
给一个点打上标记求一个节点最近的打上了标记的祖先 解题思路
就是求深度最大的打上了标记的祖先先跑一遍dfsdfsdfs序然后对于修改操作就在线段树上整个子树的区间打一个最大值。
这里为了方便线段树就只维护了答案节点的深度然后用倍增跑到那个节点。
时间复杂度:O(nlogn):O(n\log n):O(nlogn) codecodecode
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N1e510;
struct Tree_node{int l,r,w;
};
struct Seq_Tree{Tree_node t[N*4];void Build(int x,int l,int r){t[x].ll;t[x].rr;if(lr) return;int mid(lr)/2;Build(x*2,l,mid);Build(x*21,mid1,r);}void Change(int x,int l,int r,int w){if(t[x].llt[x].rr){t[x].wmax(t[x].w,w);return;}int mid(t[x].lt[x].r)1;if(rmid) Change(x*2,l,r,w);else if(lmid) Change(x*21,l,r,w);else Change(x*2,l,mid,w),Change(x*21,mid1,r,w);return;}int Ask(int x,int pos){if(t[x].lt[x].r) return t[x].w;int mid(t[x].lt[x].r)1;if(posmid) return max(t[x].w,Ask(x*2,pos));else return max(t[x].w,Ask(x*21,pos));}
}T;
struct node{int to,next;
}a[N];
int n,Q,tot,cnt,ls[N],dep[N];
int dfn[N],ed[N],f[N][18];
void addl(int x,int y)
{a[tot].toy;a[tot].nextls[x];ls[x]tot;
}
void dfs(int x)
{dfn[x]cnt;for(int ils[x];i;ia[i].next)dep[a[i].to]dep[x]1,dfs(a[i].to);ed[x]cnt;
}
int main()
{scanf(%d%d,n,Q);for(int i1;in;i){int x,y;scanf(%d%d,x,y);addl(x,y);f[y][0]x;}dep[1]1;dfs(1);T.Build(1,1,n);T.Change(1,1,n,1);for(int j1;j18;j)for(int i1;in;i)f[i][j]f[f[i][j-1]][j-1];while(Q--){char op[3];int x;scanf(%s%d,op,x);if(op[0]C)T.Change(1,dfn[x],ed[x],dep[x]);else{int kT.Ask(1,dfn[x]);for(int j17;j0;j--)if(dep[f[x][j]]k)xf[x][j];printf(%d\n,x);}}
}