Submission #408604

#TimeUsernameProblemLanguageResultExecution timeMemory
408604MKopchevToy Train (IOI17_train)C++14
100 / 100
1123 ms1500 KiB
#include "train.h"
#include<bits/stdc++.h>
using namespace std;

const int nmax=5e3+42;
int who[nmax];
int charge[nmax];

vector<int> prv[nmax];

bool on[nmax];
int n;

int outp[nmax];

bool been[nmax];

int owner;

int deg[nmax];

void dfs(int node)
{
    //cout<<"dfs "<<node<<" "<<owner<<endl;

    if(been[node])return;

    been[node]=1;

    for(auto w:prv[node])
    {
        //cout<<"w= "<<w<<" node= "<<node<<endl;

        if(who[w]==owner)dfs(w);
        else
        {
            deg[w]--;
            if(deg[w]==0)dfs(w);
        }
    }
}
vector<int> f(int person,vector<int> start)
{
    for(int i=1;i<=n;i++)been[i]=0;

    owner=person;

    for(auto w:start)
    {
        dfs(w);
    }

    vector<int> ret={};
    for(int i=1;i<=n;i++)
        if(been[i])ret.push_back(i);

    //cout<<"f "<<person<<" start: ";for(auto w:start)cout<<w<<" ";cout<<" ret: ";for(auto w:ret)cout<<w<<" ";cout<<endl;

    return ret;
}
std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	n=a.size();
	for(int i=1;i<=n;i++)who[i]=a[i-1];

	for(int i=1;i<=n;i++)charge[i]=r[i-1];

	for(int i=1;i<=n;i++)on[i]=1;

	while(1)
	{
	    for(int i=1;i<=n;i++)
        {
            prv[i]={};
            deg[i]=0;
        }

	    for(int i=0;i<u.size();i++)
        {
            int from=u[i]+1;
            int to=v[i]+1;

            if(on[from]&&on[to])
            {
                prv[to].push_back(from);

                //cout<<"prv "<<to<<" "<<from<<endl;

                deg[from]++;
            }
        }

        vector<int> remain={},charges={};
        for(int i=1;i<=n;i++)
            if(on[i])
            {
                remain.push_back(i);
                if(charge[i])charges.push_back(i);
            }

        vector<int> help=f(1,charges);

        if(help==remain)
        {
            for(auto w:help)
                outp[w]=1;

            break;
        }
        else
        {
            vector<int> other={};

            int j=0;
            for(auto w:remain)
            {
                if(j<help.size()&&w==help[j])j++;
                else other.push_back(w);
            }

            help=f(0,other);

            for(auto w:help)
            {
                on[w]=0;
            }
        }
	}

	vector<int> ret={};
	for(int i=1;i<=n;i++)
        ret.push_back(outp[i]);

    return ret;
}

/*
int main() {
	int n, m;
	assert(2 == scanf("%d %d", &n, &m));

	vector<int> a(n), r(n), u(m), v(m);

	for(int i = 0; i < n; i++)
		assert(1 == scanf("%d", &a[i]));

	for(int i = 0; i < n; i++)
		assert(1 == scanf("%d", &r[i]));

	for(int i = 0; i < m; i++)
		assert(2 == scanf("%d %d", &u[i], &v[i]));

	vector<int> res = who_wins(a, r, u, v);

	for(int i = 0; i < (int)res.size(); i++)
		printf(i ? " %d" : "%d", res[i]);
	printf("\n");

	return 0;
}
*/

Compilation message (stderr)

train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:77:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |      for(int i=0;i<u.size();i++)
      |                  ~^~~~~~~~~
train.cpp:116:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |                 if(j<help.size()&&w==help[j])j++;
      |                    ~^~~~~~~~~~~~
#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...