제출 #607739

#제출 시각아이디문제언어결과실행 시간메모리
607739Drew_Kangaroo (CEOI16_kangaroo)C++17
100 / 100
59 ms17108 KiB
#include <bits/stdc++.h>
using namespace std;
 
const int mod = 1e9 + 7;
 
template<int MOD = mod>
struct Mint
{
	int val;
 
	Mint(int64_t val_ = 0) : val((int)(val_ % MOD)) { if (val < 0) val += MOD; }
 
	Mint& operator+= (const Mint &rhs) { val += rhs.val; if (val >= MOD) val -= MOD; return *this; }
	Mint& operator-= (const Mint &rhs) { val -= rhs.val; if (val < 0) val += MOD; return *this; }
	Mint& operator*= (const Mint &rhs) { val = (int)(1ll * val * rhs.val % MOD); return *this; }
 
	friend Mint fpow(Mint x, int64_t y)
	{
		Mint res = 1;
		for (; y > 0; y >>= 1, x *= x) if (y & 1)
			res *= x;
		return res;
	}
	friend Mint inverse(Mint x) { return fpow(x, MOD-2); }
	Mint& operator/= (const Mint &rhs) { return *this *= inverse(rhs); }
 
	friend Mint operator+ (Mint a, const Mint &b) { return a += b; }
	friend Mint operator- (Mint a, const Mint &b) { return a -= b; }
	friend Mint operator- (Mint a) { return 0 - a; }
	friend Mint operator* (Mint a, const Mint &b) { return a *= b; }
	friend Mint operator/ (Mint a, const Mint &b) { return a /= b; }
 
	friend bool operator== (const Mint &a, const Mint &b) { return a.val == b.val; }
	friend bool operator!= (const Mint &a, const Mint &b) { return a.val != b.val; }
	friend ostream& operator<< (ostream &os, const Mint &a) { return os << a.val; }
};
 
namespace brute
{
	void solve(int n, int s, int t)
	{
		vector<int> v(n);
		iota(v.begin(), v.end(), 1);
 
		int ctr[69][69] = {};
 
		do
		{
			bool ok = true;
			for (int i = 1; i+1 < n; ++i)
			{
				if (v[i] > v[i-1] == v[i] > v[i+1]);
				else ok = false;
			}
 
			if (ok)
			{
				ctr[v[0]][v.back()]++;
				// if (v[0] == s && v.back() == t)
				// {
				// 	for (int x : v)
				// 		cerr << x << ", ";
				// 	cerr << '\n';
				// }
			}
 
		} while (next_permutation(v.begin(), v.end()));
 
		cerr << ctr[s][t] << '\n';
		// for (int i = 1; i <= n; ++i)
		// 	for (int j = 1; j <= n; ++j)
		// 		cerr << ctr[i][j] << " \n"[j == n];
	}
}
 
const int MAX = 2069;
 
int N, S, T;
Mint<> dp[MAX][MAX]; // dp[index][low points]
 
int main()
{
	ios :: sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
 
	cin >> N >> S >> T;
 
	// brute :: solve(N, S, T);
 
	dp[0][0] = 1;
	int ctr = 0; // end points
	for (int i = 1; i <= N; ++i)
	{
		if (i == S || i == T)
		{
			if (ctr == 0)
			{
				// act as high end point
				for (int j = 1; j <= N; ++j)
					dp[i][j] += dp[i-1][j];
 
				// act as new low point
				for (int j = 0; j <= N; ++j)
					dp[i][j+1] += dp[i-1][j];
			}
			else
			{
				if (i == N)
				{
					dp[i][1] += dp[i-1][1]; // end point
				}
				else
				{
					// act as high end point
					for (int j = 2; j <= N; ++j)
						dp[i][j] += dp[i-1][j];
 
					// act as new low point
					for (int j = 1; j <= N; ++j)
						dp[i][j+1] += dp[i-1][j];
				}
			}
 
			ctr++;
		}
		else
		{
			// connect two low points
			for (int j = 2; j <= N; ++j)
			{
				// simply merge two middle components
				if (j - ctr >= 2)
				{
					dp[i][j-1] += (j - ctr - 1) * dp[i-1][j];
				}
 
				// merge left or right component
				if (j - ctr >= 1)
				{
					dp[i][j-1] += ctr * dp[i-1][j];
				}
 
				// merge left and right component
				if (j == 2 && i == N)
				{
					dp[i][j-1] += dp[i-1][j];	
				}
			}
 
			// add new low points
			for (int j = ctr; j <= N; ++j)
				dp[i][j+1] += (j+1 - ctr) * dp[i-1][j];
		}
 
		// cerr << "i -> " << i << '\n';
		// for (int j = 1; j <= N; ++j)
		// 	cerr << j << ": " << dp[i][j] << '\n';
		// cerr << "\n\n";
	}
 
	cout << dp[N][1] << '\n';
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

kangaroo.cpp: In function 'void brute::solve(int, int, int)':
kangaroo.cpp:52:14: warning: suggest parentheses around comparison in operand of '==' [-Wparentheses]
   52 |     if (v[i] > v[i-1] == v[i] > v[i+1]);
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...