日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 5448. 【NOIP2017提高A组冲刺11.3】机房比教室好多了

發布時間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5448. 【NOIP2017提高A组冲刺11.3】机房比教室好多了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

這里有一個N 個點的樹, 節點從1 到N 編號, 第i 條邊連接了ai 和bi.
一開始第i 個點上有Ai 個石頭. Takahashi 和Aoki 會玩一個游戲.
首先, Takahashi 會選擇一個出發點; 然后, 從Takahashi 開始, 他們會輪流進行如下操作:
? 首先, 從當前的點上拿走一個石頭.
? 然后, 走到一個相鄰的點上.
當一個玩家無法執行操作時, 他就輸了. 請你找到所有可以讓Takahashi 獲勝的出發點.

Input

N
A1 A2 ::: AN
a1 b1 …
aN?1 bN?1

Output

按升序輸出一行表示可以讓Takahashi 獲勝的出發點.

Sample Input

輸入1:

3
1 2 3
1 2
2 3

輸入2:

5
5 4 1 2 3
1 2
1 3
2 4
2 5

輸入3:

3
1 1 1
1 2
2 3

Sample Output

輸出1:

2

輸出2:

1 2

輸出3:

(輸出為空)

Data Constraint

對于30% 的數據, N <=7;Ai <= 6;
對于60% 的數據, N <= 2000;
對于100% 的數據, 1 <= N <= 10^6, 1 <= ai, bi <= N; 0 <= Ai <= 10^9, 保證輸入的是一棵樹.

Solution

  • 設布爾數組 bz[i] 表示節點 i 是否可行(0 不可行,1 可行)。

  • 我們可以發現一個顯然的結論:對于一個節點 x 和它的兒子節點 y

  • 如果滿足 A[x]>A[y]bz[y]=0 ,則有 bz[x]=1

  • 因為我可以不斷從 x 走到 y ,不斷把對方“壓”到失敗點。

  • 那么這樣就能從下往上處理出 bz 數組,即能 O(N^2) 得出答案。

  • 由于換一次根(O(1)),子樹答案不會改變,只有原根與新根的關系改變了。

  • 所以直接判斷其是否符合上述條件即可,時間復雜度 O(N)

Code

#include<cstdio> using namespace std; const int N=1e6+1; int tot; int first[N],next[N<<1],en[N<<1]; int a[N]; bool bz[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'); } inline void insert(int x,int y) {next[++tot]=first[x];first[x]=tot;en[tot]=y; } inline void dfs(int x,int y) {for(int i=first[x];i;i=next[i])if(en[i]!=y){dfs(en[i],x);if(!bz[x] && a[en[i]]<a[x]) bz[x]=!bz[en[i]];} } inline void find(int x,int y) {for(int i=first[x];i;i=next[i])if(en[i]!=y){if(!bz[x] && a[en[i]]>a[x]) bz[en[i]]=true;find(en[i],x);} } int main() {int n=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<n;i++){int x=read(),y=read();insert(x,y);insert(y,x);}dfs(1,0),find(1,0);for(int i=1;i<=n;i++)if(bz[i]) write(i),putchar(' ');return 0; }

總結

以上是生活随笔為你收集整理的JZOJ 5448. 【NOIP2017提高A组冲刺11.3】机房比教室好多了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。