也许数据过水?
查看原帖
也许数据过水?
350270
CatFromMars楼主2025/2/1 21:39

如题,楼主在优化的时候优化成了这样一个样子,抱着试试看的态度提交了

void dp(int u, int fa) {
	vector <node> son;
	son.push_back(node(-1, -1));
	for(int i = 0; i < gra[u].size(); i++) {
		int v = gra[u][i].to;
		if(v == fa) continue;
		dp(v, u);
		son.push_back(gra[u][i]);
	}

	int lim = son.size() - 1, r = 1;
	
	g[0][1] = 1;
	for(int i = 1; i <= lim; i++) {
		int v = son[i].to;
		bool fg = son[i].flag;

		for(int j = 1; j <= r + siz[v]; j++) {
			g[i][j] = 0;

			for(int k1 = 1; k1 <= min(j, r); k1++) {
				int L, R;
				if(!fg) L = 1, R = j - k1;
				else L = j - k1 + 1, R = siz[v];
				upd(g[i][j], C[j - 1][k1 - 1] * C[siz[v] + r - j][r - k1] % Mod * g[i - 1][k1] % Mod * ((hf[v][R] - hf[v][L - 1]) % Mod + Mod) % Mod);
			}
		}
		r += siz[v];
	}

	for(int i = 1; i <= r; i++) {
		f[u][i] = g[lim][i];
		hf[u][i] = (hf[u][i - 1] + g[lim][i]) % Mod;
	}
}

显然,从任何角度看这个做法时间复杂度都是假的,将树构造成一条链就是 O(n3)O(n^3),但是它惊喜的通过了所有的测试点,令人忍俊不禁。

因为这是省选真题所以大概率不会加强数据 qwq 但是还是希望在讨论区里面给厚仁看个乐子。

2025/2/1 21:39
加载中...