Submission #62483

# Submission time Handle Problem Language Result Execution time Memory
62483 2018-07-28T18:44:07 Z zetapi Parachute rings (IOI12_rings) C++14
0 / 100
4000 ms 63264 KB
#include <bits/stdc++.h>
using namespace std;

#define pb  push_back
#define mp  make_pair
#define ll 	long long
#define itr ::iterator 

typedef pair<int,int>  pii;

const int MAX=1e6+99;

vector<int> vec[MAX];

int linear[4],destruct[4],deg[4][MAX],OtherEnd[4][MAX];

int N,cnt,CycleSize,Quad,a,b;

void Init(int N_) 
{
  	N=N_;
  	for(int A=0;A<N;A++)
  		OtherEnd[0][A]=A;
  	return ;
}

void Add(int X,int Y)
{
	for(int A=0;A<4;A++) 	
	{
		if(!linear[A] or destruct[A]==X or destruct[A]==Y)
			continue;
		deg[A][X]++;
		deg[A][Y]++;
		if(deg[A][X]==3 or deg[A][Y]==3 or OtherEnd[A][X]==Y)
		{
			linear[A]=0;
			continue;
		}
		a=OtherEnd[A][X];
		b=OtherEnd[A][Y];
		OtherEnd[A][X]=-1;
		OtherEnd[A][Y]=-1;
		OtherEnd[A][a]=b;
		OtherEnd[A][b]=a;
	}
	return ;
}

void Split(int X)
{
	destruct[0]=X;
	destruct[1]=vec[X][0];
	destruct[2]=vec[X][1];
	destruct[3]=vec[X][2];
	for(int A=0;A<4;A++)
	{
		linear[A]=1;
		for(int B=0;B<N;B++)
		{
			deg[A][B]=0;
			OtherEnd[A][B]=B;
		}
	}
	for(int A=0;A<N;A++)
		for(auto B:vec[A])
			if(A<B)
				Add(A,B);
	return ;	
}

void Link(int X,int Y) 
{
	if(cnt>1)
		return ;
	a=X;
	b=Y;
	if(!Quad)
	{
		vec[X].pb(Y);
		vec[Y].pb(X);
		deg[0][X]++;
		deg[0][Y]++;
		if(deg[0][X]==3)
		{
			Quad=1;
			Split(X);
			return ;
		}
		if(deg[0][Y]==3)
		{
			Quad=1;
			Split(Y);
			return ;
		}
		if(OtherEnd[0][X]!=Y)
		{
			a=OtherEnd[0][X];
			b=OtherEnd[0][Y];
			OtherEnd[0][X]=-1;
			OtherEnd[0][Y]=-1;
			OtherEnd[0][a]=b;
			OtherEnd[0][b]=a;
			return ;
		}
		cnt++;
		if(cnt==1)
		{
			int cur=X,pre=X;
			do
			{
      
				CycleSize++;
				if(vec[cur][0]==pre)
			 		cur=vec[cur][1];
				else
					cur=vec[cur][0];
				pre=cur;
			}
			while(cur!=X);
		}
	}
	else
		Add(X,Y);
	return ;
}

int CountCritical() 
{	
	if(!Quad)
	{
		if(cnt>1)
			return 0;
		else if(CycleSize)
			return CycleSize;
		else
			return N;
	}
	else
		return (linear[0]+linear[1]+linear[2]+linear[3]);
}

/*signed main()
{
	ios_base::sync_with_stdio(false);

	Init(7);
	cout<<CountCritical()<<"\n";
	Link(1,2);
	cout<<CountCritical()<<"\n";
	Link(0,5);
	cout<<CountCritical()<<"\n";
	Link(2,0);
	cout<<CountCritical()<<"\n";
	Link(3,2);
	cout<<CountCritical()<<"\n";
	Link(3,5);
	cout<<CountCritical()<<"\n";
	Link(4,3);
	cout<<CountCritical()<<"\n";
	return 0;
}*/
# Verdict Execution time Memory Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 24 ms 24180 KB Output is correct
3 Correct 25 ms 24180 KB Output is correct
4 Incorrect 22 ms 24180 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 492 ms 44388 KB Output is correct
2 Correct 818 ms 63192 KB Output is correct
3 Correct 373 ms 63192 KB Output is correct
4 Execution timed out 4026 ms 63264 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 24 ms 24180 KB Output is correct
3 Correct 25 ms 24180 KB Output is correct
4 Incorrect 22 ms 24180 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 24 ms 24180 KB Output is correct
3 Correct 25 ms 24180 KB Output is correct
4 Incorrect 22 ms 24180 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Correct 24 ms 24180 KB Output is correct
3 Correct 25 ms 24180 KB Output is correct
4 Incorrect 22 ms 24180 KB Output isn't correct
5 Halted 0 ms 0 KB -