国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Gym 100796C Minimax Tree

2019-11-08 02:10:12
字體:
供稿:網(wǎng)友

Gym 100796C Minimax Tree

dfs 編程能力 想法

傳送門:HustOJ

傳送門:CodeForce


題意

給出一棵n個(gè)節(jié)點(diǎn)的樹,有l(wèi)個(gè)葉節(jié)點(diǎn),每個(gè)葉節(jié)點(diǎn)都有一個(gè)value值?,F(xiàn)有k個(gè)min標(biāo)簽,n-l-k個(gè)max標(biāo)簽,安排中間節(jié)點(diǎn)的標(biāo)簽,輸出根節(jié)點(diǎn)可能的最大值和最小值。min標(biāo)簽表示向上傳遞兒子中的最小值,max傳遞最大值。


思路

主要是dfs。 %%%1 %%%2

就最小值來講,要想讓某一個(gè)節(jié)點(diǎn)的值最終傳遞到根節(jié)點(diǎn),它的祖先節(jié)點(diǎn)中必須全部采用min標(biāo)簽,最大值亦然。

然后這題想想就會(huì)發(fā)現(xiàn)就是dfs,每遞歸一層,層數(shù)lev就要加一,求出每個(gè)節(jié)點(diǎn)可能的最大值與最小值?;厮輹r(shí)根據(jù)當(dāng)前層數(shù)和標(biāo)簽數(shù)的關(guān)系寫入當(dāng)前節(jié)點(diǎn)的minmax值。

但是這樣會(huì)掛在test11。

然后需要注意到,如果一個(gè)節(jié)點(diǎn)只有一個(gè)孩子,那么他向上傳遞的值與標(biāo)簽無關(guān)。所以dfs時(shí),如果一個(gè)節(jié)點(diǎn)只有一個(gè)孩子,那么遞歸進(jìn)他的孩子時(shí)lev數(shù)不加1就行了。

這是一個(gè)樣例,單步一下看看回溯時(shí)minval[5]的值就明白了。

8 2 1 2 3 4 5 5 1 0 0 0 0 0 1 10 5


代碼

#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <vector>#include <cmath>#include <queue>#include <stack>#define _ ios_base::sync_with_stdio(0);cin.tie(0);#define M(a,b) memset(a,b,sizeof(a));using namespace std;const int MAXN=100005;const int oo=0x3f3f3f3f;typedef long long LL;const LL loo=4223372036854775807ll;typedef long double LB;vector<int> son[MAXN];int valmin[MAXN], valmax[MAXN];int fa[MAXN];int dfsmin(int n, int lev, int mlev){ int res=oo, maval=0; if(son[n].size()==0) return valmin[n]; for(int i=0;i<son[n].size();i++) { int temp=dfsmin(son[n][i], son[n].size()==1 ? lev : lev+1, mlev); maval=max(maval, temp); res=min(res, temp); } return valmin[n]=(lev>mlev ? maval : res);}int dfsmax(int n, int lev, int mlev){ int res=0, mival=oo; if(son[n].size()==0) return valmax[n]; for(int i=0;i<son[n].size();i++) { int temp=dfsmax(son[n][i], son[n].size()==1 ? lev : lev+1, mlev); mival=min(mival, temp); res=max(res, temp); } return valmax[n]=(lev>mlev ? mival : res);}int main(){ _ int n; while(cin>>n) { int k;cin>>k; for(int i=0;i<=n;i++) son[i].clear(); M(valmin, 0);M(fa, -1); int leaf=0; for(int i=2;i<=n;i++) { int tt;cin>>tt; fa[i]=tt;son[tt].push_back(i); } for(int i=1;i<=n;i++) { int tt;cin>>tt; valmin[i]=tt; valmax[i]=tt; if(tt!=0) leaf++; } cout<<dfsmin(1, 1, k)<<' '; cout<<dfsmax(1, 1, n-k-leaf)<<endl; } return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 莲花县| 滕州市| 乃东县| 西充县| 龙川县| 宜州市| 兴宁市| 沙河市| 长垣县| 开化县| 望都县| 乐山市| 四子王旗| 惠州市| 临海市| 特克斯县| 绥滨县| 穆棱市| 南江县| 依兰县| 昭平县| 土默特右旗| 西畴县| 枝江市| 泸水县| 朝阳市| 屯昌县| 修水县| 仙桃市| 凌云县| 漳州市| 二手房| 兴城市| 乌拉特后旗| 冕宁县| 东光县| 淳化县| 武安市| 鹰潭市| 运城市| 壤塘县|