이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// moreflags=grader.cpp
//
// 13
//
#include "train.h"
#include<vector>
#if not LOCAL
#define NDEBUG
#endif
#include<cassert>
#include<algorithm>
std::vector<std::vector<int>> add, reverse;
std::vector<int> order;
std::vector<char> state;
void work(int node){
assert(not state[node]); state[node]=true;
for(auto other: add[node]) if(not state[other])
work(other);
order.push_back(node);
}
std::vector<int> component;
void work2(int node){
assert(state[node]); state[node]=false;
for(auto other: reverse[node]) if(state[other])
work2(other);
component.push_back(node);
}
std::vector<int> awin;
std::vector<bool> keep;
std::vector<int> outDegree;
std::vector<int> a;
void remove(int node){
assert(keep[node]);
keep[node]=false;
for(auto other: reverse[node]) {
--outDegree[other];
assert(outDegree[other]>=0); assert(outDegree[other]<(int)add[other].size());
}
for(auto other: reverse[node]) if(keep[other]){
if(a[other]){
remove(other);
}else{
if(outDegree[other]==0)
remove(other);
}
}
}
void remove2(int node){
assert(keep[node]);
keep[node]=false;
for(auto other: reverse[node]) {
--outDegree[other];
assert(outDegree[other]>=0); assert(outDegree[other]<(int)add[other].size());
}
for(auto other: reverse[node]) if(keep[other]){
if(a[other]){
if(outDegree[other]==0)
remove2(other);
}else{
remove2(other);
}
}
}
std::vector<int> who_wins(std::vector<int> a_, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
::a=std::move(a_);
add.clear(); reverse.clear();
add.resize(a.size());
reverse.resize(a.size());
for(int index=0; index<(int)u.size(); ++index){
auto const first=u[index], sec=v[index];
add[first].push_back(sec); reverse[sec].push_back(first);
}
awin.assign(a.size(), true);
bool useful;
do{
useful=false;
/*
for(int mask=noChargeMask; mask; mask=(mask-1)&noChargeMask){
for(int node=0; node<(int)a.size(); ++node)
if(mask>>node&1){
if(a[node]){
if(not contains(mask|bwin, adjacent[node]))
goto next_mask;
}else{
if(((mask|bwin)&adjacent[node])==0)
goto next_mask;
}
}
bwin|=mask;
next_mask:;
}
for(int node=0; node<(int)a.size(); ++node)
if(a[node]){
if(contains(bwin, adjacent[node])) bwin|=1<<node;
}else{
if((bwin&adjacent[node])!=0) bwin|=1<<node;
}
*/
keep.assign(a.size(), true);
outDegree.resize(a.size());
for(int node=0; node<(int)a.size(); ++node){
outDegree[node]=(int)add[node].size();
}
for(int node=0; node<(int)add.size(); ++node)
if(keep[node] and r[node] and awin[node])
remove(node);
for(int node=0; node<(int)add.size(); ++node){
if(not awin[node]) assert(keep[node]);
if(awin[node] and keep[node]){
useful=true;
awin[node]=false;
}
}
// ======
keep.assign(a.size(), true);
outDegree.resize(a.size());
for(int node=0; node<(int)a.size(); ++node){
outDegree[node]=(int)add[node].size();
}
for(int node=0; node<(int)add.size(); ++node)
if(keep[node] and not awin[node])
remove2(node);
for(int node=0; node<(int)add.size(); ++node){
if(not awin[node]) assert(not keep[node]);
if(awin[node] and not keep[node]){
useful=true;
awin[node]=false;
}
}
}while(useful);
return std::move(awin);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |