답안 #404199

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
404199 2021-05-13T23:51:33 Z bigg 친구 (IOI14_friend) C++14
69 / 100
33 ms 4912 KB
#include "friend.h"
#include<bits/stdc++.h>
using namespace std;
// Find out best sample
const int MAXN = 1e5 + 10;
vector<int> grafo[MAXN];
int dp[MAXN][5], v[MAXN], comp[MAXN], maxc[MAXN];
int mat[15][15];
void dfsc(int x, int p, int c){
	comp[x] = c;
	for(int v : grafo[x]){
		if(v == p) continue;
		dfsc(v, x, c);
	}
}

void dfs(int x, int p){
	dp[x][0] = 0, dp[x][1] = v[x];
	for(int v : grafo[x]){
		if(v == p) continue;
		dfs(v, x);
		dp[x][0] += max(dp[v][0], dp[v][1]);
		dp[x][1] += dp[v][0];
	}
}

int conf[MAXN], ht[MAXN], pt[MAXN], n;

int solve1(){
	int ans = 0;
	for(int i = 1; i < n; i++){
			if(pt[i] == 0){
				grafo[i].push_back(ht[i]);
				grafo[ht[i]].push_back(i);
				mat[i][ht[i]] = mat[ht[i]][i] = 1;
			}
			if(pt[i] >= 1){
				for(int v : grafo[ht[i]]){
					grafo[i].push_back(v);
					grafo[v].push_back(i);
					mat[i][v] = mat[v][i] = 1;
				}
				if(pt[i] == 2){
					grafo[i].push_back(ht[i]);
					grafo[ht[i]].push_back(i);
					mat[i][ht[i]] = mat[ht[i]][i] = 1;
				}
			}
		}
		for(int i = 0; i < (1<<n); i++){
			int aq = 0;
			bool ok = 0;
			for(int v1 = 0; v1 < n; v1++){
				for(int v2 = v1 + 1; v2 < n; v2++){
					if((1<<v1) & i && (1<<v2) & i && mat[v1][v2]) ok = 1;
				}
			}
			if(ok) continue;
			for(int j = 0; j < n; j++){

				if((1<<j) & i) aq += conf[j];
				
			}
			
			ans = max(ans, aq);
		}
		return ans;
}

int solve2(){
	int ans = 0;
	for(int i = 0; i < n; i++) ans += conf[i];
	return ans;
}

int solve3(){
	int ans = 0;
	for(int i = 0; i < n; i++) ans = max(ans, conf[i]);
	return ans;
}

int solve4(){
	int ans = 0;
	for(int i = 0; i < n; i++) v[i] = conf[i];
	for(int i = 1; i < n; i++){
		grafo[ht[i]].push_back(i);
		grafo[i].push_back(ht[i]);
	}
	int c = 0;
	for(int i = 0; i < n; i++){
		if(!comp[i]){
			dfsc(i,i, ++c);
		}
	}
	for(int i = 0; i < n; i++){
		dfs(i, i);

		maxc[comp[i]] = max(maxc[comp[i]], dp[i][1]);
	}
	for(int i = 1; i <= c; i++) ans += maxc[i];
	return ans;
}


int marcb[MAXN], match[MAXN];
vector<int> qual[4];


bool dfsm(int x){
	for(int v : grafo[x]){
		if(marcb[v]) continue;
		marcb[v] = 1;
		if(match[v] == -1 || dfsm(match[v])){
			match[v] = x;
			match[x] = v;
			return true;
		}
	}
	return false;
}

int solve5(){
	qual[0].push_back(0);
	for(int i = 1; i < n; i++){
		if(pt[i] == 0){
			grafo[ht[i]].push_back(i);
			grafo[i].push_back(ht[i]);
			comp[i] = 1-comp[ht[i]];
			qual[comp[i]].push_back(i);
		}else{
			for(int v : grafo[ht[i]]){
				grafo[i].push_back(v);
				grafo[v].push_back(i);
			}
			comp[i] = comp[ht[i]];
			qual[comp[i]].push_back(i);
		}
	}
	for(int i = 0; i < n; i++) match[i] = -1;
	int ans = 0;
	bool flag=  1;
	while(flag){
		flag = 0;
		for(int i = 0; i < n; i++) marcb[i] = 0;
		for(int x : qual[0]){
			if(match[x] != -1) continue;
			if(dfsm(x)){
				flag = 1;
				ans++;
			}
		}
	}
	return n - ans;
}


int findSample(int N,int c[],int h[],int p[]){
	n = N;
	for(int i = 0; i < n; i++) conf[i] = c[i];
	for(int i = 1; i < n; i++) ht[i] = h[i], pt[i] = p[i];
	if(n <= 10){
		return solve1();
	}
	int ok = 1;
	for(int i = 1; i < n; i++) if(pt[i] != 1) ok = 0;
	if(ok && n <= 1000){
		return solve2();	
	}
	ok = 1;
	for(int i = 1; i < n; i++) if(pt[i] != 2) ok = 0;
	if(ok && n <= 1000){
		return solve3();
		
	}
	ok = 1;
	for(int i = 1; i < n; i++) if(pt[i] != 0) ok = 0;
	if(ok && n <= 1000){
		return solve4();
	}
	ok = 1;
	for(int i = 1; i < n; i++) if(pt[i] == 2) ok = 0;
	for(int i = 0; i < n; i++) if(conf[i] != 1) ok = 0;
	if(ok && n <= 1000){
		return solve5();
	}
	return 0;
	
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Correct 2 ms 2636 KB Output is correct
4 Correct 2 ms 2636 KB Output is correct
5 Correct 2 ms 2636 KB Output is correct
6 Correct 2 ms 2636 KB Output is correct
7 Correct 2 ms 2636 KB Output is correct
8 Correct 2 ms 2636 KB Output is correct
9 Correct 2 ms 2636 KB Output is correct
10 Correct 2 ms 2636 KB Output is correct
11 Correct 2 ms 2636 KB Output is correct
12 Correct 2 ms 2636 KB Output is correct
13 Correct 2 ms 2636 KB Output is correct
14 Correct 2 ms 2636 KB Output is correct
15 Correct 2 ms 2636 KB Output is correct
16 Correct 2 ms 2636 KB Output is correct
17 Correct 2 ms 2636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Correct 3 ms 2636 KB Output is correct
4 Correct 2 ms 2636 KB Output is correct
5 Correct 2 ms 2636 KB Output is correct
6 Correct 2 ms 2636 KB Output is correct
7 Correct 2 ms 2636 KB Output is correct
8 Correct 2 ms 2636 KB Output is correct
9 Correct 2 ms 2636 KB Output is correct
10 Correct 3 ms 2636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Correct 2 ms 2636 KB Output is correct
4 Correct 2 ms 2636 KB Output is correct
5 Correct 2 ms 2636 KB Output is correct
6 Correct 3 ms 2636 KB Output is correct
7 Correct 3 ms 2636 KB Output is correct
8 Correct 2 ms 2636 KB Output is correct
9 Correct 2 ms 2636 KB Output is correct
10 Correct 3 ms 2636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Correct 2 ms 2636 KB Output is correct
4 Correct 2 ms 2636 KB Output is correct
5 Correct 14 ms 2764 KB Output is correct
6 Correct 19 ms 2776 KB Output is correct
7 Correct 2 ms 2636 KB Output is correct
8 Correct 18 ms 2764 KB Output is correct
9 Correct 2 ms 2636 KB Output is correct
10 Correct 4 ms 2636 KB Output is correct
11 Correct 6 ms 2636 KB Output is correct
12 Correct 18 ms 2764 KB Output is correct
13 Correct 19 ms 2768 KB Output is correct
14 Correct 2 ms 2636 KB Output is correct
15 Correct 20 ms 2764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Correct 2 ms 2636 KB Output is correct
4 Correct 2 ms 2636 KB Output is correct
5 Correct 2 ms 2636 KB Output is correct
6 Correct 2 ms 2636 KB Output is correct
7 Correct 2 ms 2636 KB Output is correct
8 Correct 2 ms 2636 KB Output is correct
9 Correct 14 ms 2852 KB Output is correct
10 Correct 2 ms 2636 KB Output is correct
11 Correct 3 ms 2636 KB Output is correct
12 Correct 2 ms 2636 KB Output is correct
13 Correct 2 ms 2636 KB Output is correct
14 Correct 3 ms 2764 KB Output is correct
15 Correct 3 ms 2636 KB Output is correct
16 Correct 2 ms 2636 KB Output is correct
17 Correct 2 ms 2636 KB Output is correct
18 Correct 2 ms 2636 KB Output is correct
19 Correct 2 ms 2636 KB Output is correct
20 Correct 2 ms 2764 KB Output is correct
21 Correct 3 ms 2764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Correct 2 ms 2636 KB Output is correct
4 Correct 2 ms 2636 KB Output is correct
5 Correct 2 ms 2636 KB Output is correct
6 Correct 2 ms 2588 KB Output is correct
7 Correct 3 ms 2636 KB Output is correct
8 Correct 2 ms 2636 KB Output is correct
9 Correct 2 ms 2636 KB Output is correct
10 Correct 2 ms 2636 KB Output is correct
11 Correct 2 ms 2636 KB Output is correct
12 Incorrect 33 ms 4912 KB Output isn't correct
13 Halted 0 ms 0 KB -