當(dāng)前位置:
首頁(yè) >
[BZOJ 4551][Tjoi2016Heoi2016]树(并查集)
發(fā)布時(shí)間:2025/3/21
19
豆豆
生活随笔
收集整理的這篇文章主要介紹了
[BZOJ 4551][Tjoi2016Heoi2016]树(并查集)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
在2016年,佳媛姐姐剛剛學(xué)習(xí)了樹(shù),非常開(kāi)心。現(xiàn)在他想解決這樣一個(gè)問(wèn)題:給定一顆有根樹(shù)(根為1),有以下 兩種操作:1. 標(biāo)記操作:對(duì)某個(gè)結(jié)點(diǎn)打上標(biāo)記(在最開(kāi)始,只有結(jié)點(diǎn)1有標(biāo)記,其他結(jié)點(diǎn)均無(wú)標(biāo)記,而且對(duì)于某個(gè) 結(jié)點(diǎn),可以打多次標(biāo)記。)2. 詢問(wèn)操作:詢問(wèn)某個(gè)結(jié)點(diǎn)最近的一個(gè)打了標(biāo)記的祖先(這個(gè)結(jié)點(diǎn)本身也算自己的祖 先)你能幫幫他嗎?Solution
還是非常巧妙的思維
離線,先記錄每個(gè)點(diǎn)的標(biāo)記數(shù),倒序處理詢問(wèn),遇到打標(biāo)記就把標(biāo)記數(shù)減一,對(duì)于標(biāo)記數(shù)為0的點(diǎn)就用并查集與它的父節(jié)點(diǎn)合并
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<vector> #define MAXN 100005 using namespace std; int n,q,head[MAXN],cnt=0,f[MAXN],father[MAXN],num[MAXN],sign[MAXN]; char opt[MAXN]; vector<int>v; struct Node {int next,to; }Edges[MAXN*2]; void addedge(int u,int v) {Edges[++cnt].next=head[u];head[u]=cnt;Edges[cnt].to=v; } int read() {int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; } int find(int x) {if(father[x]==x)return x;return father[x]=find(father[x]); } void dfs(int u) {if(!sign[u])father[u]=find(f[u]); for(int i=head[u];~i;i=Edges[i].next){int v=Edges[i].to;if(v==f[u])continue;f[v]=u;dfs(v);} } int main() {memset(head,-1,sizeof(head));n=read(),q=read();for(int i=1;i<n;i++){int u=read(),v=read();addedge(u,v);addedge(v,u);father[i]=i;}father[n]=n,sign[1]++;for(int i=1;i<=q;i++){opt[i]=getchar();while(opt[i]!='Q'&&opt[i]!='C')opt[i]=getchar();num[i]=read();if(opt[i]=='C')sign[num[i]]++;}dfs(1);for(int i=q;i>0;i--){if(opt[i]=='C'){sign[num[i]]--;if(!sign[num[i]])father[num[i]]=find(f[num[i]]);}elsev.push_back(find(num[i]));}for(int i=v.size()-1;i>=0;i--)printf("%d\n",v[i]);return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/Zars19/p/6872287.html
總結(jié)
以上是生活随笔為你收集整理的[BZOJ 4551][Tjoi2016Heoi2016]树(并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AD域服务器卸载---WindowsSe
- 下一篇: poj2104(划分树模板)