沒有兄弟的舞會 百度之星2018 複賽 貪心

2021-08-25 08:09:37 字數 1517 閱讀 9666

度度熊、光羽、帶勁三個人是好朋友。

度度熊有一棵n個點的有根樹,其中1號點為樹根。除根節點之外,每個點都有父節點,記i號點的父節點為fa[i]。

度度熊稱點i和點j是**兄弟**(其中i≠j)當且僅當fa[i]=fa[j]。

第i個點的權值為ai。現要求選出乙個點集,該點集合法當且僅當**點集中至多只有一對兄弟**。

度度熊想知道,在所有可行的點集中,權值和**最大**以及**最小**的點集權值和分別是多少?

第一行乙個數,表示資料組數t。

每組資料第一行乙個整數n;第二行n−1個數,表示fa[2],fa[3],..,fa[n];第三行n個數,表示ai。

資料組數t=100,滿足:

- 1≤n≤105

- −109≤ai≤109

- 1≤fa[i]其中90%的資料滿足n≤1000。

每組資料輸出一行,每行包含兩個數,分別表示權值和的**最大值**和**最小值**。

1       1    2     2

-4    -4    -1   -2   -5

1     1     3    2

-1    -4    2    0    -2

0 -15

2 -7

由於我的電腦出現了問題,沒辦法,有些**可能開啟有點麻煩,所有的題,我都放在部落格上,

方便後來看一看吧,可惡的(unbuntu 18.04)。

這個題其實挺簡單的,後來發現,這個題目就是貪心即可。

首先我們排序一下。我們只需要標記一下父節點即可。

然而題解說了一句話。。。樹形dp也行。我只是在這裡挖個坑,

等我學習了樹形dp就需要回來這裡看一看。

當時我做題就是腦子進水了導致爆零了,但是,我清楚,複賽是前50,人家中石油都可以做到。

我們更應該向別人學習,我知道現在我還是雛鳥。我相信自己,把時間多學學新的演算法。

下一年的現在我一定要進入前500名。

#includeusing namespace std;

typedef long long ll;

const int n=1e5+10;

typedef struct nodenode;

void solve();

a[1].fa=n-1;

for(int i=2;i<=n;i++)

for(int i=1;i<=n;i++)

sort(a+1,a+n+1,(node x,node y));

ll ans1=0,ans2=0;

int flag1=0,flag2=0;

for(int i=1;i<=n;i++)else if(mp[fa]==0&&w>0)else if(w<=0)

}memset(mp,0,sizeof(mp));

sort(a+1,a+n+1,(node x,node y)

}printf("%lld %lld\n",ans1,ans2);

}int main()

return 0;

}

2018 百度之星

資格賽 problem a problem b problem c problem d problem e problem f 初賽 a problem a 簽到題problem b 用deque雙端佇列模擬即可。插入的時候用insert。problem c problem d problem e ...

2018百度之星(B)degree

度度熊最近似乎在研究圖論。給定乙個有 n個點 vertex 以及 m條邊 edge 的無向簡單圖 undirected graph 此圖中保證沒有任何圈 cycle 存在。現在你可以對此圖依序進行以下的操作 移除至多 k條邊。在保持此圖是沒有圈的無向簡單圖的條件下,自由的新增邊至此圖中。請問最後此圖...

2018百度之星初賽1003

problem description 度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊...