JZOJ 5438. 【NOIP2017提高A组集训10.31】Tree
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5438. 【NOIP2017提高A组集训10.31】Tree
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Input
Output
Sample Input
10
1 1 0 0 1 0 0 0 0 0
1 2
2 3
2 4
4 5
2 6
6 7
7 8
7 9
4 10
Sample Output
1 3 4 5 6
Data Constraint
Solution
首先,答案一定是唯一的,一個點不可能被標記兩次。
考慮在樹中由下至上處理。
一個點的顏色如果和其父親相同,那么就不可能標記這個點,不然就沒有貢獻。
那么我們討論與父親顏色不相同的情況。
如果自己是 黑色 ,父親是 白色 ,那么顯然標記這個點,不然之后就不能再改到了。
如果自己是 白色 ,父親是 黑色 ,那么顯然也要標記這個點,不然之后就不能統一修改了。
綜上所述,一個點的顏色如果和其父親相同,就直接標記這個點。
注意特判根節點(我設為 1 號點),根節點為黑色的話也要標記它。
于是我們把要標記的點統計在一個桶里,順序輸出即可(快排都不用)。
時間復雜度是飛快的 O(N) 。
Code
#include<cstdio> using namespace std; const int N=5e5+1; bool a[N],ans[N]; inline int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } inline void write(int x) {if(x>9) write(x/10);putchar(x%10+'0'); } int main() {int n=read();for(int i=1;i<=n;i++) a[i]=read();ans[1]=a[1];for(int i=1;i<n;i++){int x=read(),y=read();if(a[x]!=a[y]) ans[y]=true;}for(int i=1;i<=n;i++)if(ans[i]) write(i),putchar(' ');return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5438. 【NOIP2017提高A组集训10.31】Tree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5437. 【NOIP2017
- 下一篇: BZOJ 3673: 可持久化并查集 b