Submission #1334387

#TimeUsernameProblemLanguageResultExecution timeMemory
1334387i271828Laser Strike (EGOI25_laserstrike)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;

const int MAX=2e3+5;

int P,N;

namespace part1{
	vector<int> adj[MAX];
	bool vis[MAX];
	int dst[MAX];
	int par[MAX];
	queue<int> dq;
	bool diam[MAX];
	
	void out(int x){
		if (!vis[x]&&N) cout<<x<<'\n',N--,vis[x]=1;
	}
	
	void solve(){
		return;
		for (int i=0;i<N-1;i++){
			int a,b;cin>>a>>b;
			adj[a].push_back(b);
			adj[b].push_back(a);
		}
		dq.push(0);
		int x;
		while (dq.size()){
			x=dq.front();
			dq.pop();
			vis[x]=1;
			for (auto a:adj[x]) if (!vis[a]) dq.push(a);
		}
		fill_n(vis,N,0);
		
		dq.push(x);
		int y;
		while (dq.size()){
			y=dq.front();
			dq.pop();
			vis[y]=1;
			for (auto a:adj[y]) if (!vis[a]) par[a]=y,dst[a]=dst[y]+1,dq.push(a);
		}
		fill_n(vis,N,0);
		
		if (x>par[x]&&y<par[y]) swap(x,y);
		
		if (x>par[x]&&y>par[y]) cout<<"1\n";
		else if (x<par[x]&&y<par[y]) cout<<"0\n";
		else cout<<"\n";
		
		int p=y;
		while (2*dst[p]-1>dst[y]) p=par[p];
		
		dq.push(p);
		while (dq.size()){
			int v=dq.front();
			dq.pop();
			vis[v]=1;
			for (auto a:adj[v]) if (!vis[a]) par[a]=v,dq.push(a);
		}
		fill_n(vis,N,0);
		
		diam[p]=1;
		int q=x;
		while (q!=p) diam[q]=1,q=par[q];
		q=y;
		while (q!=p) diam[q]=1,q=par[q];
		
		N--;
		out(x),out(y);
		x=par[x],y=par[y];
		for (auto a:adj[x]) if (!diam[a]) out(a);
		for (auto a:adj[y]) if (!diam[a]) out(a);
		int cur=x,oth=y;
		bool side=0;
		while (N){
			out(cur);
			cur=par[cur];
			for (auto a:adj[cur]) if (!diam[a]) out(a);
			for (int i=0;i<N;i++){
				if (diam[par[i]]) continue;
				bool f=1;
				for (auto a:adj[i]) if (a!=par[i]&&!vis[a]) f=0;
				if (f&&((side==0&&i<par[i])||(side==1&&i>par[i]))) out(i);
			}
			swap(cur,oth);
			side=!side;
		}
	}
};

namespace part2{
	void out(int x){
		cout<<x<<'\n',N--;
	}
	void solve(){
		cin.ignore(100, '\n');
        string str;
        getline(cin,str);
        N--;
		int l,r;
		{
			int a,b;cin>>a>>b;
			if (str==""||str=="0") out(min(a,b)),l=max(a,b);
			else out(max(a,b)),l=min(a,b);
		}
		{
			int a,b;cin>>a>>b;
			if (str=="0") out(min(a,b)),r=max(a,b);
			else out(max(a,b)),r=min(a,b);
		}
		
		int a,b;
		cin>>a>>b;
		while (N){
			if (a!=l&&b!=l) break;
			out(a==l?b:a);
			if (N) cin>>a>>b;
			else break;
		}
		while (N){
			if (a!=r&&b!=r) break;
			out(a==r?b:a);
			if (N) cin>>a>>b;
			else break;
		}
		
		int cur=r,oth=l;
		bool side=0;
		while (N){
			if (cur==oth){
				out(a==cur?b:a);
				if (N) cin>>a>>b;
				else break;
				continue;
			}
			if (a==oth||b==oth){
				side=!side;
				swap(cur,oth);
				out(cur);
				cur=a==cur?b:a;
				if (N) cin>>a>>b;
				else break;
				continue;
			}
			if (a==cur||b==cur) out(a==cur?b:a);
			else{
				if (side==0) out(min(a,b));
				else out(max(a,b));
			}
			if (N) cin>>a>>b;
			else break;
		}
	}
};

int main() {
	cin>>P>>N;
	if (P==1) part1::solve();
	else part2::solve();
}
#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...