Submission #1313221

#TimeUsernameProblemLanguageResultExecution timeMemory
1313221BigBadBullyStations (IOI20_stations)C++20
100 / 100
393 ms592 KiB
#include "stations.h"
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ff first
#define ss second
using namespace std;
const int inf = 1e9;


vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) {
	vector<int> bi(n,0);
	vector<int> sbt(n,1),c(n,1);
	vector<vector<int>> graph(n);
	for(int i = 0; i < n-1; i++)
	{
		graph[u[i]].push_back(v[i]);
		graph[v[i]].push_back(u[i]);
	}
	function<void(int,int)> dfs = [&](int cur,int prev)
	{
		c[cur] = 1-c[prev];
		for(int a : graph[cur])
			if(a!=prev)
				dfs(a,cur),sbt[cur]+=sbt[a];
	};
	dfs(0,0);
	int t = 0;
	dfs =[&](int cur,int prev)
	{
		if(c[cur])
			bi[cur]=t+sbt[cur]-1;
		else
			bi[cur]=t++;
		for(int a : graph[cur])
			if(a!=prev)
				dfs(a,cur);
		if(c[cur])t++;
	};
	dfs(0,0);
	return bi;
}

int find_next_station(int s, int t, vector<int> c) {
	if(find(c.begin(),c.end(),t)!=c.end())
		return t;
	if(s==0)
		return *upper_bound(c.begin(),c.end(),t);
	if(s < c[0])
	{
		c.insert(c.begin(),s);
		if(t<c[0])
			return c.back();
		if(t>c.back())
			return c.back();
		int x = *upper_bound(c.begin(),c.end(),t);	
		return x;
	}
	else
	{
		c.push_back(s);
		if(t<c[0])
			return c[0];
		if(t>c.back())
			return c[0];
		int x = *--upper_bound(c.begin(),c.end(),t);
		return x;
	}
	return c[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...