《如 何 速 通 一 套 题》6.0
1.《如 何 速 通 一 套 题》12.《如 何 速 通 一 套 题》23.《如 何 速 通 一 套 题》34.《如 何 速 通 一 套 题》 4.15.《如 何 速 通 一 套 题》5.06.《如 何 速 通 一 套 题》5.1bug fixed
7.《如 何 速 通 一 套 题》6.0
8.《如 何 速 通 一 套 题》7.09.《如 何 速 通 一 套 题》8.010.《如 何 速 通 一 套 题》9.011.《如 何 速 通 一 套 题》 10.012.《如 何 速 通 一 套 题》12.013.《如 何 速 通 一 套 题》13.014.《如 何 速 通 一 套 题》14.015.标题,你懂的(15.0)...16.16.0邮寄
开场秒掉 A。
然后陷入了无尽的 BCD 循环中......
C 推了我好久,然后没推出来......
A 集合
考虑每一个子集和的贡献。设
答案是
但是
注意!!
对于指数上的数,千万不要
根据费马小定理,
然后就可以了......
#include <bits/stdc++.h> #define int long long using namespace std; const int kMod = 998244353; int n, dp[40040], lm, ans = 1; int qpow(int x, int y) { int rs = 1; for(; y; y >>= 1) { if(y & 1) { rs = rs * x % kMod; } x = x * x % kMod; } return rs; } signed main() { freopen("set.in", "r", stdin); freopen("set.out", "w", stdout); cin >> n; lm = n * (n + 1) / 2; dp[0] = 1; for(int i = 1; i <= n; i++) { for(int j = lm - i; j >= 0; j--) { dp[j + i] = (dp[j + i] + dp[j]) % (kMod - 1); // -1 is key } } for(int i = 1; i <= lm; i++) { ans = ans * qpow(i, dp[i]) % kMod; } cout << ans << '\n'; return 0; }
B 出租
考虑一个区间
可以写出如下方程:
稍微变形一下:
维护左边的最大子段和,然后就可以直接判断了。
如何动态求解最大子段和(Spoiler Alert!)
动态维护,果断祭出线段树。
维护如下四个信息:
合并如下:
由于只有单点修改,所以不需要多少维护。
#include <bits/stdc++.h> #define int long long using namespace std; struct dat { int pm, sm, as, fs; dat(int s = -1e10, int p = -1e10, int d = -1e10, int f = -1e10) : pm(), sm(), as(), fs() { pm = s, sm = p, as = d, fs = f; } dat operator ^(const dat &b) const { return dat(max(pm, fs + b.pm), max(sm + b.fs, b.sm), max({as, b.as, sm + b.pm}), fs + b.fs); } }d[2000020]; int n, m, k, l, arr[500050], x, y; void build(int id = 1, int l = 1, int r = n) { if(l == r) { d[id] = {arr[l], arr[l], arr[l], arr[l]}; return ; } int mid = (l + r) >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); d[id] = d[id * 2] ^ d[id * 2 + 1]; } void modify(int x, int v, int id = 1, int l = 1, int r = n) { if(l == r) { arr[l] = v; d[id] = {arr[l], arr[l], arr[l], arr[l]}; return ; } int mid = (l + r) >> 1; if(x <= mid) { modify(x, v, id * 2, l, mid); }else { modify(x, v, id * 2 + 1, mid + 1, r); } d[id] = d[id * 2] ^ d[id * 2 + 1]; } dat query(int ql, int qr, int id = 1, int l = 1, int r = n) { if(r < ql || qr < l) { return dat(); } if(ql <= l && r <= qr) { return d[id]; } int mid = (l + r) >> 1; dat a = query(ql, qr, id * 2, l, mid), b = query(ql, qr, id * 2 + 1, mid + 1, r); return a ^ b; } signed main() { freopen("hire.in", "r", stdin); freopen("hire.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n >> m >> k >> l; for(int i = 1; i <= n; i++) { arr[i] -= k; } build(); for(; m--; ) { cin >> x >> y; modify(x, arr[x] + y); dat tmp = query(1, n); cout << (tmp.as > k * l? "NO" : "YES") << '\n'; } return 0; }
C 连通块
观察到我们只需要处理那些“不共戴天”的节点就可以了。
然后就自然可以 dp 了。
#include <bits/stdc++.h> #define int ll using namespace std; using ll = long long; struct node { int u, v; }cnd[22]; int n, m, val[100010], l, bg[44][44], tot, id[100010], dp[100010][44], ans; vector<int> ch[100010]; void DFS(int x = 1) { for(int i = 0; i <= tot; i++) { dp[x][i] = -1e16; } dp[x][id[x]] = val[x]; for(auto i : ch[x]) { DFS(i); int mx = -1e16; for(int j = 0; j <= tot; j++) { if(!bg[j][id[i]]) { mx = max(mx, dp[x][j]); } } for(int j = 0; j <= tot; j++) { dp[x][j] = max(dp[x][j], dp[i][j] + mx); } } for(int j = 0; j <= tot; j++) { ans = max(ans, dp[x][j]); } } signed main() { freopen("block.in", "r", stdin); freopen("block.out", "w", stdout); cin >> n >> m; for(int i = 1; i <= n; i++) { cin >> val[i]; } for(int i = 1; i <= n; i++) { cin >> l; ch[i].resize(l); for(auto &j : ch[i]) { cin >> j; } } ans = -1e16; /* for(int i = 1; i <= n; i++) { ans = max(ans, val[i]); } if(ans <= 0) { cout << ans << '\n'; return 0; } //*/ for(int i = 1; i <= m; i++) { cin >> cnd[i].u >> cnd[i].v; if(!id[cnd[i].u]) { id[cnd[i].u] = ++tot; } if(!id[cnd[i].v]) { id[cnd[i].v] = ++tot; } bg[id[cnd[i].u]][id[cnd[i].v]] = bg[id[cnd[i].v]][id[cnd[i].u]] = 1; } DFS(); cout << ans << '\n'; return 0; }
D 跳棋
我们发现把所有的单个
所以设
放
放
然后答案是
#include <bits/stdc++.h> #define int ll using namespace std; using ll = long long; const int kMod = int(1e9) + 7; int n, fac[1010], inv[1010], ans, dp[2][550][550][2]; string s; void init() { fac[0] = fac[1] = 1, inv[1] = 1; inv[0] = 1; for(int i = 2; i <= 1000; i++) { fac[i] = fac[i - 1] * i % kMod; inv[i] = inv[kMod % i] * (kMod - kMod / i) % kMod; } for(int i = 2; i <= 1000; i++) { inv[i] = inv[i] * inv[i - 1] % kMod; } } int c(int x, int y) { if(x < 0 || y < 0 || x < y) { return 0; } return fac[x] * inv[x - y] % kMod * inv[y] % kMod; } signed main() { freopen("checkers.in", "r", stdin); freopen("checkers.out", "w", stdout); cin >> n >> s; n = s.size(); dp[0][0][0][0] = 1; for(int i = 0; i < n; i++) { for(int j = 0; j <= n; j++) { for(int k = 0; k <= n; k++) { if(s[i] != '1') { dp[1][j][k + 1][0] = (dp[1][j][k + 1][0] + dp[0][j][k][0] + dp[0][j][k][1]) % kMod; } if(s[i] != '0') { dp[1][j][k][1] = (dp[1][j][k][1] + dp[0][j][k][0]) % kMod; dp[1][j + 1][k][0] = (dp[1][j + 1][k][0] + dp[0][j][k][1]) % kMod; } } } for(int j = 0; j <= n; j++) { for(int k = 0; k <= n; k++) { dp[0][j][k][0] = dp[1][j][k][0], dp[0][j][k][1] = dp[1][j][k][1]; dp[1][j][k][0] = dp[1][j][k][1] = 0; } } } init(); for(int i = 0; i <= n; i++) { for(int j = 0; j <= n; j++) { ans = (ans + (dp[0][i][j][0] + dp[0][i][j][1]) % kMod * c(i + j, j)) % kMod; } } cout << ans << '\n'; return 0; }
合集:
《如 何 速 通 一 套 题》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具