#include "train.h"
#include<bits/stdc++.h>
using namespace std;
const int N=5005;
const int M=20005;
int n,m;
int a[N],r[N];
int vis[N];
vector<int> adj[N],radj[N];
vector<int> ans;
stack<int> st;
vector<vector<int>> scc;
int sccid[N];
int deg[N],del[N];
bool lose[N],win[N];
bool selfloop[N];
queue<int> q;
void scc1(int u,bool block=true){
if(vis[u])return;
vis[u]=true;
for(auto v:adj[u])if(!block||!r[v])scc1(v,block);
st.emplace(u);
}
void scc2(int u,bool block=true){
if(vis[u])return;
vis[u]=true;
scc.back().emplace_back(u);
sccid[u]=scc.size();
for(auto v:radj[u])if(!block||!r[v])scc2(v,block);
}
vector<int> who_wins(vector<int> A, vector<int> R, vector<int> U, vector<int> V) {
n=A.size();
m=U.size();
ans.resize(n);
for(int i=0;i<N;i++)a[i]=A[i],r[i]=R[i];
for(int i=0;i<m;i++){
int u=U[i],v=V[i];
if(u==v)selfloop[u]=true;
else{
adj[u].emplace_back(v);
radj[v].emplace_back(u);
deg[u]++;
}
}
// cerr << "LOSE\n";
for(int i=0;i<n;i++)if(!r[i])scc1(i);
for(int i=0;i<n;i++)vis[i]=false;
while(!st.empty()){
auto u=st.top();
st.pop();
if(vis[u])continue;
scc.emplace_back(vector<int>(0));
scc2(u);
}
for(auto com:scc){
bool ok=true;
for(auto u:com){
if(a[u]==0)continue;
for(auto v:adj[u]){
if(sccid[v]!=sccid[u]){
ok=false;
break;
}
}
if(!ok)break;
}
if(com.size()==1&&!selfloop[com[0]])ok=false;
// for(auto u:com)cerr << u << " ";
// cerr << ": " << ok << "\n";
if(ok)for(auto u:com)lose[u]=true;
}
// for(int i=0;i<n;i++)cerr << lose[i] << " \n"[i==n-1];
for(int i=0;i<n;i++)if(lose[i])q.emplace(i);
while(!q.empty()){
auto u=q.front();
q.pop();
for(auto v:radj[u]){
del[v]++;
if(lose[v])continue;
if(a[v]==0||(del[v]==deg[v]&&!(selfloop[v]&&r[v]))){
lose[v]=true;
q.emplace(v);
}
}
}
// for(int i=0;i<n;i++)cerr << lose[i] << " \n"[i==n-1];
// cerr << "WIN\n";
scc.clear();
for(int i=0;i<n;i++)vis[i]=false;
for(int i=0;i<n;i++)scc1(i,false);
for(int i=0;i<n;i++)vis[i]=false;
while(!st.empty()){
auto u=st.top();
st.pop();
if(vis[u])continue;
scc.emplace_back(vector<int>(0));
scc2(u,false);
}
for(auto com:scc){
bool ok=true,ok2=false;
for(auto u:com){
if(r[u]==1)ok2=true;
if(a[u]==0)continue;
for(auto v:adj[u]){
if(sccid[v]!=sccid[u]){
ok=false;
break;
}
}
if(!ok)break;
}
ok&=ok2;
if(com.size()==1&&!selfloop[com[0]])ok=false;
// for(auto u:com)cerr << u << " ";
// cerr << ": " << ok << "\n";
if(ok)for(auto u:com)if(!lose[u])win[u]=true;
}
// for(int i=0;i<n;i++)cerr << win[i] << " \n"[i==n-1];
for(int i=0;i<n;i++)if(win[i])q.emplace(i);
while(!q.empty()){
auto u=q.front();
q.pop();
for(auto v:radj[u]){
del[v]++;
if(win[v])continue;
if(a[v]==0||(del[v]==deg[v]&&!lose[v])){
win[v]=true;
q.emplace(v);
}
}
}
// for(int i=0;i<n;i++)cerr << win[i] << " \n"[i==n-1];
for(int i=0;i<n;i++)ans[i]=win[i]&!lose[i];
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
1876 KB |
3rd lines differ - on the 14th token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
596 KB |
3rd lines differ - on the 2nd token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
2020 KB |
Output is correct |
2 |
Correct |
6 ms |
1892 KB |
Output is correct |
3 |
Correct |
6 ms |
1896 KB |
Output is correct |
4 |
Incorrect |
7 ms |
1748 KB |
3rd lines differ - on the 1st token, expected: '1', found: '0' |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
1492 KB |
Output is correct |
2 |
Correct |
7 ms |
1748 KB |
Output is correct |
3 |
Correct |
10 ms |
1764 KB |
Output is correct |
4 |
Correct |
7 ms |
1620 KB |
Output is correct |
5 |
Correct |
7 ms |
1876 KB |
Output is correct |
6 |
Correct |
7 ms |
1748 KB |
Output is correct |
7 |
Correct |
8 ms |
1748 KB |
Output is correct |
8 |
Correct |
7 ms |
1620 KB |
Output is correct |
9 |
Correct |
6 ms |
1620 KB |
Output is correct |
10 |
Correct |
8 ms |
1768 KB |
Output is correct |
11 |
Correct |
6 ms |
1748 KB |
Output is correct |
12 |
Correct |
7 ms |
1748 KB |
Output is correct |
13 |
Correct |
8 ms |
1748 KB |
Output is correct |
14 |
Correct |
7 ms |
1620 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
7 ms |
1620 KB |
3rd lines differ - on the 2nd token, expected: '0', found: '1' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
1876 KB |
3rd lines differ - on the 14th token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |