Submission #1228018

#TimeUsernameProblemLanguageResultExecution timeMemory
1228018MuhammadSaramMin-max tree (BOI18_minmaxtree)C++20
0 / 100
524 ms327680 KiB
#include <bits/stdc++.h>

using namespace std;

const int M = 70001, lg = 17;

vector<int> nei[M];
// set<pair<int,int>> se[2];
vector<pair<int,int>> ad[M];
int par[M][lg],dep[M],ed[M];

void dfs(int u)
{
	for (int p=1;p<lg;p++)
		par[u][p]=par[par[u][p-1]][p-1];
	for (int i:nei[u])
		if (i!=par[u][0])
			par[i][0]=u,dep[i]=dep[u]+1,dfs(i);
}

int lca(int u,int v)
{
	if (dep[u]>dep[v]) swap(u,v);
	int d=dep[v]-dep[u];
	for (int p=0;p<lg;p++)
		if (d>>p&1)
			v=par[v][p];
	if (u==v) return v;
	for (int p=lg-1;p>=0;p--)
		if (par[u][p]!=par[v][p])
			u=par[u][p],v=par[v][p];
	return par[u][0];
}

set<int> se[M];

void dfs1(int u)
{
	for (int i:nei[u])
		if (i!=par[u][0])
		{
			dfs1(i);
			for (int x:se[i])
				se[u].insert(x);
		}
	for (auto [x,i]:ad[u])
		if (i) se[u].insert(x);
	for (auto [x,i]:ad[u])
		if (!i) se[u].erase(x);
	if (par[u][0])
	{
		if (se[u].empty())
			ed[u]=0;
		else
			ed[u]=*se[u].begin();
	}
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL),cout.tie(NULL);
	
	int n;
	cin>>n;
	for (int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		nei[u].push_back(v);
		nei[v].push_back(u);
	}
	dfs(1);
	int k;
	cin>>k;
	for (int i=0;i<k;i++)
	{
		char c;
		cin>>c;
		int u,v,x;
		cin>>u>>v>>x;
		int l=lca(u,v);
		ad[u].push_back({x,1});
		ad[v].push_back({x,1});
		ad[l].push_back({x,0});
	}
	dfs1(1);
	for (int i=2;i<=n;i++)
		cout<<i<<' '<<par[i][0]<<' '<<ed[i]<<endl;
	
	return 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...