Submission #819850

#TimeUsernameProblemLanguageResultExecution timeMemory
819850Cyber_WolfFriend (IOI14_friend)C++17
27 / 100
54 ms65536 KiB
#include <bits/stdc++.h>
#include "friend.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#pragma GCC optimize("Ofast")

using namespace std;
using namespace __gnu_pbds;

#define lg long long
#define ordered_set	tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 1e3+5;

vector<set<int>> adj(N);
int cost[N], dp[N][2], par[N], ans[N];

int get(int n)
{
	if(par[n] == n)	return n;
	return par[n] = get(par[n]);
}

void join(int u, int v)
{
	par[get(u)] = get(v);
	return;
}

int dfs(int src, int par = -1, int x = 0)
{
	auto&ret = dp[src][x];
	if(~ret)	return ret;
	int ans = (!x)*cost[src];
	for(auto it : adj[src])
	{
		if(it == par)	continue;
		int ch = dfs(it, src, x^1);
		if(x)
		{
			ch = max(ch, dfs(it, src, x));
		}
		ans += ch;
	}
	return ret = ans;
}

int findSample(int n, int c[], int h[], int p[])
{
	cost[0] = c[0];
	for(int i = 0; i < n; i++)	par[i] = i;
	for(int i = 1; i < n; i++)
	{
		p[i]++;
		cost[i] = c[i];
		if(p[i]&2)
		{
			for(auto it : adj[h[i]])
			{
				adj[i].insert(it);
				adj[it].insert(i);
				join(i, it);
			}
		}
		if(p[i]&1)
		{
			adj[i].insert(h[i]);
			adj[h[i]].insert(i);
			join(i, h[i]);
		}
	}
	for(int i = 0; i < n; i++)
	{
		memset(dp, -1, sizeof(dp));
		ans[get(i)] = max(ans[get(i)], dfs(i));
	}
	int fin = 0;
	for(int i = 0; i < n; i++)
	{
		if(i == get(i))	fin += ans[i];
	}
	return fin;
}
#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...