国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 庆城县| 左贡县| 博乐市| 邓州市| 通化市| 山西省| 灌阳县| 罗平县| 茂名市| 黑龙江省| 平顺县| 吴堡县| 彰化市| 八宿县| 永修县| 开封县| 区。| 昭苏县| 广元市| 庐江县| 清流县| 都安| 万年县| 西乌珠穆沁旗| 西吉县| 苏尼特右旗| 阜新市| 简阳市| 锡林浩特市| 天等县| 灵丘县| 富川| 延川县| 沾化县| 郸城县| 绵阳市| 黎平县| 龙井市| 金寨县| 东阿县| 沂水县|