1. 程式人生 > >百度之星6049-沒有兄弟的舞會(貪心)

百度之星6049-沒有兄弟的舞會(貪心)

Problem Description

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

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

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

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

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

Input

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

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

資料組數T=100,滿足:

- 1≤n≤105
- −109≤Ai≤109
- 1≤fa[i]<i

其中90%的資料滿足n≤1000。

Output

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

Sample Input

2

5

1 1 2 2

-4 -4 -1 -2 -5

5

1 1 3 2

-1 -4 2 0 -2

Sample Output

0 -15 
2 -7

思路:這道題最容易想到的就是貪心,最大值時只取大於0的權值,最小值只去小於0的權值。等我學會了樹形DP再回來優化..

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int N = 1e5;
struct node {
	int w, fa;
};
node a[N];
//對結構體排序
bool cmp1(node x, node y)
{
	if (x.w > y.w)
		return true;
	else
		return false;
}
bool cmp2(node x, node y)
{
	if (x.w < y.w)
		return true;
	else
		return false;
}
void solve() 
{
	int n;
	cin >> n;
	int mp[N] = { 0 };
	a[1].fa = N - 1;
	for (int i = 2; i <= n; i++)
	{
		cin >> a[i].fa;
	}
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i].w;
	}
	sort(a + 1, a + n + 1, cmp1);
	ll sum1 = 0, sum2 = 0;
	int flag1 = 0, flag2 = 0;
	for (int i = 1; i <= n; i++)
	{
		int fa = a[i].fa, w = a[i].w;
		if (mp[fa] == 1 && flag1 == 0 && w>0)//flag用來標誌至多隻有一對兄弟的要求
		{
			flag1 = 1;
			sum1 += w;
		}
		else if (mp[fa] == 0 && w>0)
		{
			mp[fa]++;
			sum1 += w;
		}
		else if (w <= 0)
		{
			break;
		}
	}
	memset(mp, 0, sizeof(mp));
	sort(a + 1, a + n + 1,cmp2);
	for (int i = 1; i <= n; i++)
	{
		int fa = a[i].fa, w = a[i].w;
		if (mp[fa] == 1 && flag2 == 0 && w<0)//至多一個兄弟結點
		{
			flag2 = 1;
			sum2 += w;
		}
		else if (mp[fa] == 0 && w<0)
		{
			mp[fa]++;
			sum2 += w;
		}
		else if (w >= 0)
		{
			break;
		}
	}
	cout << sum1 << " " << sum2 << endl;
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		solve();
	}
	return 0;
}

相關推薦

6049-沒有兄弟舞會貪心

Problem Description 度度熊、光羽、帶勁三個人是好朋友。 度度熊有一棵n個點的有根樹,其中1號點為樹根。除根節點之外,每個點都有父節點,記i號點的父節點為fa[i]。 度度熊稱點i和點j是**兄弟**(其中i≠j)當且僅當fa[i]=fa[j]。 第i個點

2018 “”程序設計大賽 - 初賽A1004 / hdu6377 度度熊看球賽 dp遞推

的確 就會 世界杯 .cn 世界 problem 產生 amp 表示 度度熊看球賽 Problem Description 世界杯正如火如荼地開展!度度熊來到了一家酒吧。 有 N 對情侶相約一起看世界杯,熒幕前正好有 2×N 個橫排的位置。 所有人都會隨機坐在某個位置上。

2018 “”程序設計大賽 - 初賽B

namespace main color gre lose clu its lse bits rank 264, 三題水過 ~ hdu6380_degree #include <bits/stdc++.h> using namespace std; typ

2018資格賽 1001調查問卷狀壓dp

百度之星 一行 problem nts 數據 output 兩張 href bestcode 調查問卷 Accepts: 1289 Submissions: 5642 Time Limit: 6500/6000 MS (Java/Others

沒有兄弟舞會(2018-複賽)(貪心)

Problem Description 度度熊、光羽、帶勁三個人是好朋友。 度度熊有一棵n個點的有根樹,其中1號點為樹根。除根節點之外,每個點都有父節點,記i號點的父節點為fa[i]。 度度熊稱點i和點j是**兄弟**(其中i≠j)當且僅當fa[i]=fa[j]。

HDU6409 沒有兄弟舞會(2018複賽,貪心)

Problem Description 度度熊、光羽、帶勁三個人是好朋友。 度度熊有一棵n個點的有根樹,其中1號點為樹根。除根節點之外,每個點都有父節點,記i號點的父節點為fa[i]。

hdu 5253 連接的管道(kruskal)(2015年程序設計大賽 - 初賽(2))

ostream turn targe 告訴 margin 表輸入 輸入 cst 代碼 連接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T

2014年程序設計大賽 - 資格賽 1002 Disk Schedule雙調歐幾裏得旅行商問題

problem code 數據讀取 包括 想是 tracking sample cout http Problem Description 有非常多從磁盤讀取數據的需求。包含順序讀取、隨機讀取。為了提高效率,須要人為安排磁盤讀取。然而,在現實中。這樣的做法非常復雜。

ACM-資格賽Energy Conversion——hdu4823

ios break get enter span bmi ria hint -c Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav

2014資格賽題解

.cn -i lan while pro acm 起點 pos con 比賽鏈接:點擊打開鏈接 ,,杭電把比賽關了代碼都找不到了。。 無責任民科還是mark一下好了。。 HDU 4823 Energy Conversion 把式子變換一下發現是一個等比數列,高速冪就可以

2014年程序設計大賽 - 資格賽 1001 Energy Conversion

大賽 pro 整數 code clu n) 足夠 gin bre Energy Conversion Problem Description   魔法師百小度也有遇到難題的時候——   如今,百小度正在一個古老的石門面前,石門上有一段古老的魔法文字,讀懂這樣的魔法

2014資格賽第三題

字符串 struct uri hit other printf 能夠 ava 單獨 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others

2014 1003 題解 Xor Sum

dsm xor 難題 ane rac pro 數據包 20px weight Xor Sum Problem Description Zeus 和 Prometheus 做了一個遊戲,Prometheus 給 Zeus 一個集合,集合中包括了N個正整數,隨後 P

2014資格賽4題

歐幾裏得 font define ria min read span post eight 因為都是中文題。題意就不寫了。 A、Energy Conversion 這題先推斷一下能量能否添加,然後再依據添加這個公式去求出一個等比公式。就能夠直接求出須

2016"" - 初賽Astar Round2A--HDU 5690 |數學轉化+快速冪

分享 otto lld 方法 can a* sca uic left Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes

2017""程序設計大賽 - 資格賽 度度熊的王國戰略

set ear sin 們的 ret ont 十分 turn std 度度熊的王國戰略 度度熊國王率領著喵哈哈族的勇士,準備進攻嘩啦啦族。 嘩啦啦族是一個強悍的民族,裏面有充滿智慧的謀士,擁有無窮力量的戰士。 所以這一場戰爭,將會十分艱難。 為了更好的進攻嘩啦啦族

1002 度度熊的王國戰略

超級 class mes 力量 can nbsp 是把 關系 cout Problem Description 度度熊國王率領著喵哈哈族的勇士,準備進攻嘩啦啦族。 嘩啦啦族是一個強悍的民族,裏面有充滿智慧的謀士,擁有無窮力量的戰士。 所以這一場戰爭,將會十分艱難。 為了

2017資格賽 1003:度度熊與邪惡大魔王DP

solution nav normal ner 就會 預處理 display badge rate 度度熊與邪惡大魔王 Accepts: 3021 Submissions: 18787 Time Limit: 2000/1000 MS (Java/Ot

2017資格賽 1003 度度熊與邪惡大魔王 背包DP

log accep 防禦 ssi str 完全背包 time 怪物 amp 度度熊與邪惡大魔王 Accepts: 3027 Submissions: 18837 Time Limit: 2000/1000 MS (Java/Others) Memor

度度熊的午飯時光 2017資格賽 -.-

set others spa 字典序 info iostream 最小 long long 預算 度度熊的午飯時光 Accepts: 755 Submissions: 8737 Time Limit: 2000/1000 MS (Java/Others)