結果
| 問題 |
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;
}
沙耶花