Submission #59168

#TimeUsernameProblemLanguageResultExecution timeMemory
59168TadijaSebezToy Train (IOI17_train)C++11
100 / 100
620 ms15648 KiB
#include <stdio.h>
#include <queue>
#include <vector>
using namespace std;
#define pb push_back
const int N=5050;
vector<int> R[N];
int deg[N],in[N];
bool was[N],vis[N],A[N];
void AddEdge(int u, int v){ R[v].pb(u);deg[u]++;}
void DelNode(int u){ for(int i=0;i<R[u].size();i++) deg[R[u][i]]--;was[u]=1;}
void init(int n){ for(int i=1;i<=n;i++) vis[i]=0;}
queue<int> q;
vector<int> st;
void BFS(int n, bool mod)
{
	init(n);
	int i;
	for(i=1;i<=n;i++) if(!was[i]) in[i]=(A[i]==mod)?1:deg[i];
	for(i=0;i<st.size();i++) vis[st[i]]=1,q.push(st[i]);
	while(q.size())
	{
		int u=q.front();
		q.pop();
		for(i=0;i<R[u].size();i++)
		{
			int v=R[u][i];
			if(vis[v] || was[v]) continue;
			in[v]--;
			if(!in[v])
			{
				vis[v]=1;
				q.push(v);
			}
		}
	}
}
vector<int> ch;
vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v)
{
	int n=a.size(),i,m=v.size();
	for(i=0;i<n;i++) A[i+1]=a[i];
	for(i=0;i<n;i++) if(r[i]) ch.pb(i+1);
	for(i=0;i<m;i++) AddEdge(u[i]+1,v[i]+1);
	bool done;
	do
	{
		st.clear();
		for(i=0;i<ch.size();i++) if(!was[ch[i]]) st.pb(ch[i]);
		BFS(n,1);
		st.clear();
		for(i=1;i<=n;i++) if(!was[i] && !vis[i]) st.pb(i);
		BFS(n,0);
		done=0;
		for(i=1;i<=n;i++) if(!was[i] && vis[i]) done=1,DelNode(i);
	}while(done);
	vector<int> ans;
	for(i=1;i<=n;i++) ans.pb(!was[i]);
	return ans;
}
/*int main()
{
	int n,m,i,x,y;
	vector<int> a,r,u,v;
	scanf("%i %i",&n,&m);
	for(i=0;i<n;i++) scanf("%i",&x),a.pb(x);
	for(i=0;i<n;i++) scanf("%i",&x),r.pb(x);
	for(i=0;i<m;i++) scanf("%i %i",&x,&y),u.pb(x),v.pb(y);
	vector<int> ans=who_wins(a,r,u,v);
	for(i=0;i<ans.size();i++) printf("%i ",ans[i]);printf("\n");
	return 0;
}*/

Compilation message (stderr)

train.cpp: In function 'void DelNode(int)':
train.cpp:11:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 void DelNode(int u){ for(int i=0;i<R[u].size();i++) deg[R[u][i]]--;was[u]=1;}
                                  ~^~~~~~~~~~~~
train.cpp: In function 'void BFS(int, bool)':
train.cpp:20:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0;i<st.size();i++) vis[st[i]]=1,q.push(st[i]);
          ~^~~~~~~~~~
train.cpp:25:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(i=0;i<R[u].size();i++)
           ~^~~~~~~~~~~~
train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:49:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(i=0;i<ch.size();i++) if(!was[ch[i]]) st.pb(ch[i]);
           ~^~~~~~~~~~
#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...