제출 #900142

#제출 시각아이디문제언어결과실행 시간메모리
900142Malix기지국 (IOI20_stations)C++14
100 / 100
527 ms1628 KiB
#include "stations.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;

#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define MP make_pair

void doLess(int a,vi &labels,vi &s,vector<vi> &paths,vi &parent);
void doMore(int a,vi &labels,vi &s,vector<vi> &paths,vi &parent);

int dp(int a,vi &parent,vector<vi> &paths,vi &s){
	if(paths[a].size()==1)return 1;
	for(auto u:paths[a]){
		if(u==parent[a])continue;
		parent[u]=a;
		s[a]+=dp(u,parent,paths,s);
	}
	return s[a];
}

void doLess(int a,vi &labels,vi &s,vector<vi> &paths,vi &parent){
	int d=labels[a];
	for(auto u:paths[a]){
		if(u==parent[a])continue;
		labels[u]=d-s[u];
		doMore(u,labels,s,paths,parent);
		d=labels[u];
	}
}

void doMore(int a,vi &labels,vi &s,vector<vi> &paths,vi &parent){
	int d=labels[a];
	for(auto u:paths[a]){
		if(u==parent[a])continue;
		labels[u]=d+s[u];
		doLess(u,labels,s,paths,parent);
		d=labels[u];
	}
	
}

std::vector<int> label(int n, int k, std::vector<int> u, std::vector<int> v) {
	
	std::vector<int> labels(n);
	vector<vi> paths(n);
	REP(i,0,n-1){
		paths[u[i]].PB(v[i]);
		paths[v[i]].PB(u[i]);
	}
	vi parent(n);
	parent[0]=0;
	vi s(n,1);
	for(auto u:paths[0]){
		parent[u]=0;
		s[0]+=dp(u,parent,paths,s);
	}
	labels[0]=0;
	int d=0;
	for(auto u:paths[0]){
		labels[u]=d+s[u];
		doLess(u,labels,s,paths,parent);
		d=labels[u];
	}
	//REP(i,0,n)cout<<labels[i]<<" ";
	return labels;
}

int find_next_station(int s, int t, std::vector<int> c) {
	if(c.size()==1)return c[0];
	if(s==0){
		auto it=lower_bound(c.begin(),c.end(),t);
		return *it;
	}
	if(c[0]>s){
		int g=c.back();
		c.pop_back();
		if(t>c.back()||t<s)return g;
		auto it=lower_bound(c.begin(),c.end(),t);
		return *it;
	}
	if(t<c[1]||t>s)return c[0];
	auto it=lower_bound(c.begin(),c.end(),t);
	if(it==c.end())return c.back();
	if(*it==t)return *it;
	it--;
	return *it;
	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...