首页 > 其他分享 >USACO 2020.12 Platinum Spaceship

USACO 2020.12 Platinum Spaceship

时间:2023-10-16 22:36:28浏览次数:31  
标签:Platinum typedef ll long maxn 按钮 2020.12 Spaceship define

洛谷传送门

LOJ 传送门

考虑剥路径最大值 dp,设 \(f_{k, i, j}\) 为 \(i \to j\) 中按的最大的按钮 \(\le k\) 的方案数。转移枚举按下最大值按钮的点 \(w\),有:

\[f_{k, i, j} = \sum\limits_{(u, w), (w, v) \in E} f_{k - 1, i, u} f_{k - 1, v, j} \]

在外层枚举 \(w\),设 \(g_i\) 为起点为 \(i\) 的方案数,\(h_i\) 为起点为 \(j\) 的方案数。拆式子之后有:

\[f_{k, i, j} = \sum g_i h_j \]

但是这样有个问题。不能保证 \(s \to t\) 时第一次和最后一次按下的按钮是什么。考虑对于每组询问添加虚点 \(n + i\),只有起点或终点恰好按下 \(b_s\) 或 \(b_t\) 时,\(g_i\) 或 \(h_j\) 才有 \(1\) 的贡献。dp 对应的含义加上了按下按钮的限制。

时间复杂度 \(O(nm(n + q)^2)\)。

code
// Problem: P7155 [USACO20DEC] Spaceship P
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7155
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 125;
const ll mod = 1000000007;

ll n, m, q, f[maxn][maxn][maxn], g[maxn], h[maxn];
char s[maxn][maxn];

struct node {
	ll x, y, s, t;
} a[maxn];

inline void upd(ll &x, ll y) {
	((x += y) >= mod) && (x -= mod);
}

void solve() {
	scanf("%lld%lld%lld", &n, &m, &q);
	for (int i = 1; i <= n; ++i) {
		scanf("%s", s[i] + 1);
	}
	for (int i = 1; i <= q; ++i) {
		scanf("%lld%lld%lld%lld", &a[i].x, &a[i].s, &a[i].y, &a[i].t);
	}
	for (int k = 1; k <= m; ++k) {
		for (int i = 1; i <= n + q; ++i) {
			for (int j = 1; j <= n + q; ++j) {
				f[k][i][j] = f[k - 1][i][j];
			}
		}
		for (int v = 1; v <= n; ++v) {
			mems(g, 0);
			mems(h, 0);
			g[v] = h[v] = 1;
			for (int i = 1; i <= q; ++i) {
				g[n + i] = (a[i].x == k && a[i].s == v);
				h[n + i] = (a[i].y == k && a[i].t == v);
			}
			for (int i = 1; i <= n + q; ++i) {
				for (int u = 1; u <= n; ++u) {
					if (s[u][v] == '1') {
						upd(g[i], f[k - 1][i][u]);
					}
					if (s[v][u] == '1') {
						upd(h[i], f[k - 1][u][i]);
					}
				}
			}
			for (int i = 1; i <= n + q; ++i) {
				for (int j = 1; j <= n + q; ++j) {
					upd(f[k][i][j], g[i] * h[j] % mod);
				}
			}
		}
	}
	for (int i = 1; i <= q; ++i) {
		printf("%lld\n", f[m][n + i][n + i]);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:Platinum,typedef,ll,long,maxn,按钮,2020.12,Spaceship,define
From: https://www.cnblogs.com/zltzlt-blog/p/17768541.html

相关文章

  • USACO 2021.12 Platinum Paired Up
    洛谷传送门LOJ传送门如果\(T=1\),可以把重量全部取相反数转化成\(T=2\)。接下来只考虑\(T=2\)的情况。下文的\(m\)代表原题中的\(K\)。设第\(i\)个G牛的位置和重量分别为\(a_{0,i},b_{0,i}\),第\(i\)个H牛的位置和重量分别为\(a_{1,i},b_{1,i}\)......
  • Oracle最高可用性架构(MAA)|铂金级(PLATINUM)
    1、什么是MAAMAA即最高可用性架构(MaximumAvailabilityArchitecture )Oracle最高可用性架构(MAA)为Oracle数据库提供了架构、配置和生命周期最佳实践参考之前的文章:1、Oracle最高可用性架构(MAA)|青铜级(BRONZE)https://www.cnblogs.com/mingfan/p/16804556.html2、Oracle最......
  • 【kaggle】Spaceship Titanic
    二分类问题version1:超参数:  结果: ......
  • 机器学习日志 泰坦尼克飞船 Spaceship Titanic
    PassengerId——乘客编号。每个编号的形式都表示乘客与是否是组团旅行有关,比如家庭出游,集体出差等,因此编号中有部分是表示他们在团队中的号码。但有部分乘客是独自旅行。H......
  • USACO 2023 January Contest, Platinum 题解
    TractorPaths题意:给定\(n\)个不交区间,两个区间之间有边当且仅当这两个区间的交非空。\(Q\)次询问,每次给定\(u,v\),求从\(u\)到\(v\)的最短路和最短路可能经过的点......
  • USACO2023 一月月赛 Platinum 3
    Platinum3分析树上的最优化问题先不动脑子DP一波。用\(f[i]\)表示将以\(i\)为根的子树中,所有子树都满足题设开灭条件所需要的最少次数。现在把这个子树画成下图这样,假......
  • USACO2023 一月月赛 Platinum 2
    受到样例的第四个询问启发,我们可以发现一个性质:一开始先让魔力积累,然后肯定是在最晚的那个时候,我们去把魔力池里该取的魔力取走,而不是一开始就和一个无头苍蝇一样在图上乱......
  • 【USACO2021 February Contest Platinum】Minimizing Edges(图论,贪心)
    传送门设\(d_0(u),d_1(u)\)分别表示\(1\)到\(u\)的偶数长最短路和奇数长最短路。那么即为要求\(G,G'\)的\(d_0,d_1\)都相同。先特判掉二分图的情况,这样任意\(......