Submission #62474

# Submission time Handle Problem Language Result Execution time Memory
62474 2018-07-28T18:06:46 Z zetapi Parachute rings (IOI12_rings) C++14
0 / 100
4000 ms 106348 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=2e6;

vector<int> vec[MAX];

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

int N,cnt,CycleSize,Quad;

void Init(int N_) 
{
  	N=N_;
  	cnt=0;
  	Quad=0;
  	CycleSize=0;
  	for(int A=0;A<N;A++)
  	{
  		deg[0][A]=0;
  		OtherEnd[0][A]=A;
  		vec[A].clear();
  	}
  	return ;
}

void Add(int X,int Y)
{
	int a,b;
	for(int A=0;A<4;A++) 	
	{
		if(!linear[A])
			continue;
		if(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 A,int B) 
{
	int X=A,Y=B,a,b;
	vec[X].pb(Y);
	vec[Y].pb(X);
	if(Quad==0)
	{
		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;
		}
		else 
			cnt++;
		if(cnt==1)
		{
			int cur=X,pre=X;
			do
			{
      
				CycleSize++;
				if(vec[cur][0]==pre)
				{
					pre=cur;
					cur=vec[cur][1];
				}
				else
				{
					pre=cur;
					cur=vec[cur][0];
				}
			}
			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 41 ms 47356 KB Output is correct
2 Correct 46 ms 47712 KB Output is correct
3 Correct 46 ms 47776 KB Output is correct
4 Execution timed out 4022 ms 47776 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 482 ms 67940 KB Output is correct
2 Correct 1265 ms 97808 KB Output is correct
3 Correct 964 ms 106348 KB Output is correct
4 Execution timed out 4029 ms 106348 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 41 ms 47356 KB Output is correct
2 Correct 46 ms 47712 KB Output is correct
3 Correct 46 ms 47776 KB Output is correct
4 Execution timed out 4022 ms 47776 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 41 ms 47356 KB Output is correct
2 Correct 46 ms 47712 KB Output is correct
3 Correct 46 ms 47776 KB Output is correct
4 Execution timed out 4022 ms 47776 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 41 ms 47356 KB Output is correct
2 Correct 46 ms 47712 KB Output is correct
3 Correct 46 ms 47776 KB Output is correct
4 Execution timed out 4022 ms 47776 KB Time limit exceeded
5 Halted 0 ms 0 KB -