제출 #94493

#제출 시각아이디문제언어결과실행 시간메모리
94493fjzzq2002친구 (IOI14_friend)C++14
35 / 100
26 ms16248 KiB
#include "friend.h"
#include <bits/stdc++.h>
using namespace std;
#define SZ 666666
int val[SZ],fa[SZ],fe[SZ];
vector<int> so[SZ];
int f[SZ][2][2];
inline void cmax(int&a,int b)
{if(a<b)a=b;}
void dfs(int x)
{
	int ts[2][2][2];
	memset(ts,-127/2,sizeof ts);
	ts[0][0][0]=0;
	ts[0][1][0]=val[x];
	ts[1][0][0]=0;
	for(auto ch:so[x])
	{
		dfs(ch);
		int g[2][2][2];
		memset(g,-127/2,sizeof g);
		if(fe[ch]==0)
		{
			for(int a=0;a<2;++a)
				for(int b=0;b<2;++b)
					for(int c=0;c<2;++c)
					{
						cmax(g[a][b][c],ts[a][b][c]+f[ch][b][0]);
						if(!b)
						cmax(g[a][b][1],ts[a][b][c]+f[ch][b][1]);
					}
		}
		else if(fe[ch]==1)
		{
			for(int a=0;a<2;++a)
				for(int b=0;b<2;++b)
					for(int c=0;c<2;++c)
					{
						cmax(g[a][b][c],ts[a][b][c]+f[ch][a||c][0]);
						if(!a&&!c)
						cmax(g[a][1][c],ts[a][b][c]+f[ch][0][1]);
					}
		}
		else if(fe[ch]==2)
		{
			for(int a=0;a<2;++a)
				for(int b=0;b<2;++b)
					for(int c=0;c<2;++c)
					{
						cmax(g[a][b][c],ts[a][b][c]+f[ch][a||b||c][0]);
						if(!a&&!c&&!b)
						cmax(g[a][1][1],ts[a][b][c]+f[ch][0][1]);
					}
		}
		memcpy(ts,g,sizeof g);
	}
	for(int a=0;a<2;++a)
		for(int b=0;b<2;++b)
			f[x][a][b]=max(ts[a][b][0],ts[a][b][1]);
}
int findSample(int n,int confidence[],
int host[],int protocol[]){
	for(int i=0;i<n;++i) val[i]=confidence[i];
	for(int i=1;i<n;++i)
		fa[i]=host[i],fe[i]=protocol[i],
		so[host[i]].push_back(i);
	dfs(0);
	return max(f[0][0][1],f[0][0][0]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...