답안 #79101

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
79101 2018-10-11T06:50:59 Z psmao Sailing Race (CEOI12_race) C++14
85 / 100
3000 ms 4864 KB
#include <bits/stdc++.h>
using namespace std;

#define fo(i,s,t) for(int i = s; i <= t; ++ i)
#define fd(i,s,t) for(int i = s; i >= t; -- i)
#define bf(i,s) for(int i = head[s]; i; i = e[i].next)
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pb push_back
#define VI vector<int>
#define sf scanf
#define pf printf
#define fp freopen
#define SZ(x) ((int)(x).size())
#ifdef MPS
#define D(x...) printf(x)
#else
#define D(x...)
#endif
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const int inf = 1<<30;
const ll INF = 1ll<<60;
const db Inf = 1e20;
const db eps = 1e-9;

void gmax(int &a,int b){a = (a > b ? a : b);}
void gmin(int &a,int b){a = (a < b ? a : b);}

const int maxn = 505;

int f[maxn][maxn], g[maxn][maxn], md[maxn][maxn], mdc[maxn][maxn], n, sub;
VI adj[maxn];

int main()
{
	#ifdef MPS
		fp("1.in","r",stdin);
		fp("1.out","w",stdout);
		db mps = clock();
	#endif
	sf("%d%d",&n,&sub);
	fo(i,1,n) fo(j,1,n) md[i][j] = mdc[i][j] = -inf;
	fo(i,1,n)
	{
		int x;
		while(1)
		{
			sf("%d",&x);
			if(!x) break;
			adj[i].pb(x);
			md[i][x] = mdc[i][x] = 1;
		}
	}
	fo(len,2,n)
	{
		fo(i,1,n)
		{
			int j = i+len-1;
			if(j > n) j = j - n;
			for(auto k : adj[i])
			{
				if(i < j)
				{
					if(k >= i && k < j) 
					{
						gmax(f[i][j], 1 + max(f[k][j], g[k][i]));
						gmax(md[i][j], 1 + md[k][j]);
					}
				}
				else
				{
					if(k >= i || k < j) 
					{
						gmax(f[i][j], 1 + max(f[k][j], g[k][i]));
						gmax(md[i][j], 1 + md[k][j]);
					}
				}
			}
			for(auto k : adj[j])
			{
				if(i < j)
				{
					if(k > i && k <= j) 
					{
						gmax(g[j][i], 1 + max(g[k][i], f[k][j]));
						gmax(mdc[j][i], 1 + mdc[k][i]);
					}
				}
				else
				{
					if(k > i || k <= j) 
					{
						gmax(g[j][i], 1 + max(g[k][i], f[k][j]));
						gmax(mdc[j][i], 1 + mdc[k][i]);
					}
				}
			}	
			D("%d %d %d %d\n",i,j,md[i][j],mdc[j][i]);
		}
	}
	int ans = 0, target;
	fo(s,1,n) 
		for(auto t : adj[s])
		{
			if(max(f[t][s], g[t][s]) + 1 > ans)
			{
				ans = max(f[t][s], g[t][s]) + 1;
				target = s;
			}
		}
	if(sub == 1)
	{
		fo(i,1,n)
			for(auto j : adj[i])
			{
				int A = i, B = j;
				if(A < B)
				{
					fo(C,A+1,B-1)
					{
						for(auto D : adj[C])
						{
							if(D > B || D < A)
							{
								if(1 + mdc[B][C] + 1 + max(g[D][B], f[D][A]) > ans)
								{
									ans = 1 + mdc[B][C] + 1 + max(g[D][B], f[D][A]);
									target = A; 
									D("%d %d %d %d %d\n",A,B,C,D,mdc[B][C]);
								}	
							}
						}
					}
					fo(C,1,n) if(C > B || C < A)
					{
						for(auto D : adj[C])
						{
							if(D > A && D < B)
							{
								if(1 + md[B][C] + 1 + max(f[D][B], g[D][A]) > ans)
								{
									ans = 1 + md[B][C] + 1 + max(f[D][B], g[D][A]);
									target = A; 
									D("%d %d %d %d %d\n",A,B,C,D,md[B][C]);
								}	
							}
						}
					}
				}
				else
				{
					fo(C,B+1,A-1)
					{
						for(auto D : adj[C])
						{
							if(D > A || D < B)
							{
								if(1 + md[B][C] + 1 + max(f[D][B], g[D][A]) > ans)
								{
									ans = 1 + md[B][C] + 1 + max(f[D][B], g[D][A]);
									target = A; 
									D("%d %d %d %d %d\n",A,B,C,D,md[B][C]);
								}
							}
						}
					}
					fo(C,1,n) if(C > A || C < B)
					{
						for(auto D : adj[C])
						{
							if(D > B && D < A)
							{
								if(1 + mdc[B][C] + 1 + max(g[D][B], f[D][A]) > ans)
								{
									ans = 1 + mdc[B][C] + 1 + max(g[D][B], f[D][A]);
									target = A; 
									D("%d %d %d %d %d\n",A,B,C,D,mdc[B][C]);
								}	
							}
						}
					}
				}
			}
	}
	pf("%d\n%d\n",ans,target);
	#ifdef MPS
		pf("Time Elapsed: %.3fms\n",clock()-mps);
	#endif
	return 0;
}

Compilation message

race.cpp: In function 'int main()':
race.cpp:45:4: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  sf("%d%d",&n,&sub);
    ^
race.cpp:52:6: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    sf("%d",&x);
      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 508 KB Output is correct
3 Correct 3 ms 696 KB Output is correct
4 Correct 4 ms 772 KB Output is correct
5 Correct 3 ms 900 KB Output is correct
6 Correct 7 ms 996 KB Output is correct
7 Correct 5 ms 1076 KB Output is correct
8 Correct 9 ms 1204 KB Output is correct
9 Correct 6 ms 1220 KB Output is correct
10 Correct 12 ms 1344 KB Output is correct
11 Correct 7 ms 1360 KB Output is correct
12 Correct 143 ms 2128 KB Output is correct
13 Correct 240 ms 3052 KB Output is correct
14 Correct 81 ms 3852 KB Output is correct
15 Correct 2516 ms 4732 KB Output is correct
16 Execution timed out 3048 ms 4732 KB Time limit exceeded
17 Correct 2380 ms 4864 KB Output is correct
18 Correct 79 ms 4864 KB Output is correct
19 Execution timed out 3063 ms 4864 KB Time limit exceeded
20 Execution timed out 3042 ms 4864 KB Time limit exceeded