結果
問題 | No.1328 alligachi-problem |
ユーザー | 沙耶花 |
提出日時 | 2020-11-25 22:31:40 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,686 bytes |
コンパイル時間 | 30,325 ms |
コンパイル使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2025-01-16 05:40:48 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
コンパイルが30秒の制限時間を超えました
ソースコード
#include <stdio.h> #include <bits/stdc++.h> #include "testlib.h" using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define modulo 998244353 #define mod(mod_x) ((((long long)mod_x+modulo))%modulo) #define Inf 1000000000 void NG(){ cout<<"No"<<endl; exit(0); } vector<int> topological_sort(vector<vector<int>> E){ int N = E.size(); vector<int> d(N,0); rep(i,N){ rep(j,E[i].size()){ d[E[i][j]]++; } } queue<int> Q; rep(i,N){ if(d[i]==0)Q.push(i); } vector<int> ret; while(Q.size()>0){ int u = Q.front(); Q.pop(); ret.push_back(u); rep(i,E[u].size()){ int v = E[u][i]; d[v]--; if(d[v]==0)Q.push(v); } } if(ret.size()!=N)ret.resize(0); return ret; } int main(){ //for test /* int N; cin>>N; vector<char> C(N),X(N); vector<int> Y(N); rep(i,N)cin>>C[i]>>X[i]>>Y[i]; */ //for validation registerValidation(); int N; N = inf.readInt(1,200000); inf.readEoln(); vector<char> C(N),X(N); vector<int> Y(N); rep(i,N){ C[i] = inf.readChar(); inf.readSpace(); X[i] = inf.readChar(); inf.readSpace(); Y[i] = inf.readInt(0,N-1); inf.readEoln(); assert(C[i]=='R'||C[i]=='B'); assert(X[i]=='R'||X[i]=='B'); } inf.readEof(); deque<int> B,R; rep(i,N){ if(C[i]=='B')B.push_back(-1); else R.push_back(-1); } rep(i,N){ if(C[i]==X[i]){ int t = Y[i]; if(C[i]=='R')swap(B,R); if(t>=B.size())NG(); if(B[t]!=-1)NG(); B[t] = i; if(C[i]=='R')swap(B,R); } } vector<pair<int,int>> pB,pR; rep(i,N){ if(C[i]==X[i])continue; if(C[i]=='B')pB.emplace_back(Y[i],i); else pR.emplace_back(Y[i],i); } sort(pB.begin(),pB.end()); sort(pR.begin(),pR.end()); int now = 0; rep(i,pB.size()){ while(B[now]!=-1)now++; B[now] = pB[i].second; } now = 0; rep(i,pR.size()){ while(R[now]!=-1)now++; R[now] = pR[i].second; } int n = B.size(),m = R.size(); vector<vector<int>> E(N,vector<int>()); rep(i,n-1){ E[i].push_back(i+1); } rep(i,m-1){ E[n+i].push_back(n+i+1); } rep(i,n){ int ind = B[i]; if(C[ind]==X[ind])continue; if(Y[ind]>m)NG(); if(Y[ind]!=0)E[n+Y[ind]-1].push_back(i); if(Y[ind]!=m)E[i].push_back(n+Y[ind]); } rep(i,m){ int ind = R[i]; if(C[ind]==X[ind])continue; if(Y[ind]>n)NG(); if(Y[ind]!=0)E[Y[ind]-1].push_back(n+i); if(Y[ind]!=n)E[n+i].push_back(Y[ind]); } vector<int> sorted = topological_sort(E); if(sorted.size()==0)NG(); vector<int> ans(N); rep(i,sorted.size()){ if(sorted[i]<n)ans[i] = B[sorted[i]]; else ans[i] = R[sorted[i]-n]; } cout<<"Yes"<<endl; rep(i,N){ if(i!=0)cout<<' '; cout<<ans[i]+1; } cout<<endl; return 0; }