50分求助(有注释
查看原帖
50分求助(有注释
431289
lalaouye楼主2023/8/16 10:20

TLE+WA

#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N = 15, mod = 3e5 + 7, P = 1e9 + 7;
int n, a[N];
int now[N];
int Map[N][500005];
int pw[N], cnt, mu, base = 28;
int b[2][460];
int res = 0, sx, sy, sum;

int dfs (int x, int fig, int num)
{
	if (fig == n * (n - 1) / 2 + 1 && num == mu) return 1; 
	if (now[x] + 3 * (n - x + 1) < a[x]) return 0;//全胜利都无法达到目标 
	if (b[0][fig] == x && b[1][fig] == x + 1)//记忆化 
		if (Map[n - x + 1][num] != -1) 
		{ return Map[n - x + 1][num]; }
	int xd = b[0][fig], yd = b[1][fig];
	int res = 0;//搜索状态 
	if (now[xd] + 3 <= a[xd] && sx)
	{
		now[xd] += 3; sx --;
		(res += dfs (yd == n ? xd + 1 : xd, fig + 1, (num + 3 * pw[xd]) % mod)) %= P;
		now[xd] -= 3; sx ++;
	}
	if (now[xd] < a[xd] && now[yd] < a[yd] && sy)
	{
		now[xd] ++, now[yd] ++; sy --;
		(res += dfs (yd == n ? xd + 1 : xd, fig + 1, (num + pw[xd] + pw[yd]) % mod)) %= P;
		now[xd] --, now[yd] --; sy ++;
	}
	if (now[yd] + 3 <= a[yd] && sx)
	{
		now[yd] += 3; sx --;
		(res += dfs (yd == n ? xd + 1 : xd, fig + 1, (num + 3 * pw[yd]) % mod)) %= P;
		now[yd] -= 3; sx ++;
	}
	if (yd == x + 1)Map[n - x + 1][num] = res % P;//更新 
	return res;
}
signed main ()
{
	memset (Map, -1, sizeof Map);
	scanf ("%d", &n);
	pw[n] = 1;
	for (int i = n - 1; i >= 1; i --) pw[i] = pw[i + 1] * base % mod;
	for (int i = 1; i <= n; i ++)
		for (int j = i + 1; j <= n; j ++)
			b[0][++ cnt] = i, b[1][cnt] = j;//比赛顺序 
	for (int i = 1; i <= n; i ++) scanf ("%d", a + i), sum += a[i];//总共得分 
	sort (a + 1, a + n + 1);
	for (int i = 1; i <= n; i ++) (mu += a[i] * pw[i]) %= mod;
	sx = sum - n * n + n, sy = (sum - 3 * sx) >> 1;//解方程 
	printf ("%d\n", dfs (1, 1, 0));
} 

被帖子里的hack数据hack了

10

17 8 3 15 9 12 13 10 12 16
2023/8/16 10:20
加载中...