度度熊、光羽、帶勁三個人是好朋友。
度度熊有一棵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 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊...