Submission #73751

#TimeUsernameProblemLanguageResultExecution timeMemory
73751MKopchevToy Train (IOI17_train)C++14
15 / 100
11 ms1340 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=5e3+42;
int n;
vector< int > adj[nmax];
vector<int> ret;
bool rech[nmax];
bool been[nmax][2];
void dfs(int node,bool good)
{
    if(rech[node])good=1;
    if(been[node][good])return;
    been[node][good]=1;
    for(auto k:adj[node])
        dfs(k,good);
}
int go[16];
vector<int> a_;
bool is[16];
bool can(int where)
{
    if(go[where]!=-1)
    {
        memset(is,0,sizeof(is));
        while(is[where]==0)
        {
            is[where]=1;
            where=go[where];
        }
        for(int i=0;i<n;i++)
            if(is[i]&&rech[i])return 1;
        return 0;
    }
    int player=a_[where];

    if(player==0)
    {
        for(auto k:adj[where])
        {
            go[where]=k;
            bool result=can(k);
            go[where]=-1;
            if(result==0)return 0;
        }
        return 1;
    }
    else
    {
        for(auto k:adj[where])
        {
            go[where]=k;
            bool result=can(k);
            go[where]=-1;
            if(result==1)return 1;
        }
        return 0;
    }
}
vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v)
{
    a_=a;
    bool c1=1;
    int m=u.size();
    for(int i=0; i<m; i++)
    {
        adj[u[i]].push_back(v[i]);
        if(v[i]-u[i]>1||v[i]-u[i]<0)c1=0;
    }
    n=a.size();
    for(int i=0; i<n; i++)
        rech[i]=r[i];
    bool one=1;
    for(auto k:a)
        if(k!=1)one=0;
    one=0;
    if(one)
    {
        for(int i=0; i<n; i++)
        {
            memset(been,0,sizeof(been));
            dfs(i,0);
            ret.push_back(been[i][1]);
        }
    }
    else if(c1)
    {
        for(int i=0; i<n; i++)
        {
            int where=i;
            while(1)
            {
                bool self=0;
                for(auto k:adj[where])
                    if(k==where)self=1;
                if(self==0)where++;
                else if(a[where]==r[where])
                {
                    ret.push_back(a[where]);
                    break;
                }
                else if(adj[where].size()==2)where++;
                else
                {
                    ret.push_back(!a[where]);
                    break;
                }
            }
        }
    }
    else if(n<=15)
    {
        for(int i=0;i<n;i++)
        {
            memset(go,-1,sizeof(go));
            ret.push_back(can(i));
        }
    }
    return ret;
}
/*
int main()
{
    for(auto k:who_wins({0, 1}, {1, 0}, {0, 0, 1, 1}, {0, 1, 0, 1}))cout<<k<<endl;
}
*/
#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...