제출 #69963

#제출 시각아이디문제언어결과실행 시간메모리
69963E869120장난감 기차 (IOI17_train)C++14
27 / 100
1492 ms102616 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;v.clear(); 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[j]==1) ans[i]=0; } } return ans; } return vector<int>{}; }

컴파일 시 표준 에러 (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...