Submission #69961

#TimeUsernameProblemLanguageResultExecution timeMemory
69961E869120Toy Train (IOI17_train)C++14
16 / 100
1606 ms99896 KiB
#include "train.h"
#include <bits/stdc++.h>
using namespace std;

int N, M, C[100009], R[100009], U[100009], V[100009];

int subtasks(){
	int ret = 0;
	for(int i=0;i<M;i++){
		if(U[i]==V[i] || U[i]+1==V[i]) ret++;
	}
	if(ret==M) return 1;
	int c1=0,c2=0,rr=0;
	for(int i=0;i<N;i++){
		if(C[i]==1) c1++;
		if(C[i]==2) c2++;
		if(R[i]==1) rr++;
	}
	if(c2==0) return 3;
	if(c1==0) return 4;
	if(rr==1) return 5;
	return 6;
}

int p1[5009][2],dist[5009][5009],Q[5009],cl,cr;vector<int>X[5009];

void solve(){
	for(int i=0;i<M;i++)X[U[i]].push_back(V[i]);
	for(int i=0;i<N;i++){
		cl=0;cr=1;Q[0]=i;
		while(cl<cr){
			int pos=Q[cl];cl++;
			for(int j=0;j<X[pos].size();j++){
				if(dist[i][X[pos][j]]==0){
					dist[i][X[pos][j]]=1;
					Q[cr]=X[pos][j];cr++;
				}
			}
		}
	}
}

int res[5009];bool used[5009],flag;vector<int>v;

void dfs(int pos,int srt){ 
	if(flag==true) return;
	if(pos==srt && used[pos]==true){
		for(int i=0;i<v.size();i++) res[v[i]]=1;
		flag=true;
		return;
	}
	used[pos]=true;
	for(int i=0;i<X[pos].size();i++){
		if(R[X[pos][i]]==1 || (used[X[pos][i]]==true && X[pos][i]!=srt)) continue;
		v.push_back(X[pos][i]);
		dfs(X[pos][i],srt);
		v.pop_back();
	}
}

void get_cycle(){
	for(int i=0;i<N;i++){
		if(R[i]==1 || res[i]==1) continue;
		flag=false;
		for(int j=0;j<N;j++) used[j]=false;
		dfs(i,i);
	}
}

vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	N = a.size();M=u.size();
	for(int i=0;i<N;i++){if(a[i]==1) C[i]=1;else C[i]=2; R[i]=r[i];}
	for(int i=0;i<M;i++){U[i]=u[i];V[i]=v[i];}
	
	int Subtask = subtasks();
	
	if(Subtask==1){
		for(int i=0;i<M;i++){
			if(V[i]==U[i]) p1[U[i]][0]=1;
			else p1[U[i]][1]=1;
		}
		vector<int>ans(N,0);
		for(int i=0;i<N;i++){
			for(int j=i;j<N;j++){
				if(C[j]==1 && R[j]==1 && p1[j][0]==1) {ans[i]=1;break;}
				if(C[j]==2 && R[j]==0 && p1[j][0]==1) {ans[i]=0;break;}
				if(p1[j][1]==0){
					if(R[j]==1)ans[i]=1;
					break;
				}
			}
		}
		return ans;
	}
	if(Subtask==3){
		solve();vector<int>ans(N,0);
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				if((i==j || dist[i][j]==1) && dist[j][j]==1 && R[j]==1) ans[i]=1;
			}
		}
		return ans;
	}
	if(Subtask==4){
		solve();get_cycle();vector<int>ans(N,1);
		for(int i=0;i<N;i++){
			for(int j=0;j<N;j++){
				if((i==j || dist[i][j]==1) && res[i]==1) ans[i]=0;
			}
		}
		return ans;
	}
	return vector<int>{};
}

Compilation message (stderr)

train.cpp: In function 'void solve()':
train.cpp:33:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j=0;j<X[pos].size();j++){
                ~^~~~~~~~~~~~~~
train.cpp: In function 'void dfs(int, int)':
train.cpp:48:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<v.size();i++) res[v[i]]=1;
               ~^~~~~~~~~
train.cpp:53:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<X[pos].size();i++){
              ~^~~~~~~~~~~~~~
#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...