杂 D 选 P
[ARC168E] Subsegments with Large Sums
由于有恰好
不加任何转化的话,可以发现
由于最终分段一定可以表示为若干个
注意二分答案的上界为,在不考虑
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N = 2.5e5 + 5;
int n, k; ll a[N], s[N], S;
int L[N]; ll f[N]; int g[N];
inline void Solve(int c) {
for(int i = 1; i <= n; i++) {
f[i] = g[i] = 0;
if(L[i]) {
ll w = f[L[i] - 1] + (i - L[i] + 1) - c;
if(w < f[i]) f[i] = w, g[i] = g[L[i] - 1] + 1;
}
if(f[i - 1] < f[i] || (f[i - 1] == f[i] && g[i - 1] < g[i])) f[i] = f[i - 1], g[i] = g[i - 1];
}
}
inline ll solve(int i) {
int l = 1, r = n; ll res = -1;
while(l <= r) {
int mid = l + r >> 1;
Solve(mid);
if(g[n] > i) r = mid - 1;
else l = mid + 1, res = 1ll * mid * i + f[n];
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> k >> S;
for(int i = 1; i <= n; i++) {
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
for(int i = 1, j = 1; i <= n; i++) {
while(s[i] - s[j] >= S) j++;
if(s[i] - s[j - 1] >= S) L[i] = j;
}
int upper = 0;
for(int i = 1; i <= n; i++) {
if(L[i]) f[i] = f[L[i] - 1] + 1;
f[i] = max(f[i], f[i - 1]);
}
int l = 0, r = min((int)f[n], k), res = -1;
while(l <= r) {
int mid = l + r >> 1;
if(solve(mid) - mid <= n - k) l = mid + 1, res = mid;
else r = mid - 1;
}
cout << res << "\n";
}
[CF1930G] Prefix Max Set Counting
个人最初的想法是,记
首先特判掉
这个 DP 过程可以用比较繁琐的线段树合并优化到 if(!a || !b) return;
,而本题则需在此基础上实现一个区间加状物,可以用 lazytag 实现。最后还要实现一个区间赋值或删除操作。精细实现即可做到
虽然这个做法的思维更加直接(可能大众做法也差不多?),但是实现起来较为繁琐,且
尝试直接对前缀
考虑一个上升序列可以作为答案的条件是什么。最直白的限制是,这个序列需要作为某个 dfs 序的子序列。但是 dfs 序太多了,尝试分析一些性质来简化限制。由于对于两子树
至此直接在这个特殊的 dfs 序列上 DP 即可。记
是 的祖先,即 。此时需要 是 的链上除 外的最大值。 不是 的祖先,即 。此时需要 在 方向的子树 的 ,且 是 的链上除 外的最大值。
故记
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int mod = 998244353, N = 1e6 + 5;
namespace basic {
inline int add(int x, int y) {return (x + y >= mod ? x + y - mod : x + y);}
inline int dec(int x, int y) {return (x - y < 0 ? x - y + mod : x - y);}
inline void ad(int &x, int y) {x = add(x, y);}
inline void de(int &x, int y) {x = dec(x, y);}
inline int qpow(int a, int b) {
int r = 1;
while(b) {
if(b & 1) r = 1ll * r * a % mod;
a = 1ll * a * a % mod; b >>= 1;
}
return r;
}
inline int inv(int x) {return qpow(x, mod - 2);}
int fac[N], ifac[N];
inline void fac_init(int n = N - 1) {
fac[0] = 1;
for(int i = 1; i <= n; i++)
fac[i] = 1ll * fac[i - 1] * i % mod;
ifac[n] = inv(fac[n]);
for(int i = n - 1; i >= 0; i--)
ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;
}
int invx[N];
inline void inv_init(int n = N - 1) {
invx[1] = 1;
for(int i = 2; i <= n; i++)
invx[i] = 1ll * (mod - mod / i) * invx[mod % i] % mod;
}
inline int binom(int n, int m) {
if(n < m || m < 0) return 0;
return 1ll * fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}
}
using namespace basic;
int n;
vector<int> G[N];
int M[N], f[N];
inline void pre_dfs(int u, int fa) {
if(~fa) G[u].erase(find(G[u].begin(), G[u].end(), fa));
M[u] = u;
for(auto v : G[u]) {
pre_dfs(v, u);
M[u] = max(M[u], M[v]);
}
sort(G[u].begin(), G[u].end(), [](int x, int y) {
return M[x] < M[y];
});
}
struct BIT {
int t[N];
inline void add(int x, int v) {for(; x <= n; x += x & -x) ad(t[x], v);}
inline int query(int x) {int r = 0; for(; x; x -= x & -x) ad(r, t[x]); return r;}
} bit;
inline void dfs(int u, int anc) {
if(u == 1) f[u] = 1;
else if(u < anc) f[u] = 0;
else f[u] = dec(bit.query(u), bit.query(anc - 1));
bit.add(u, f[u]);
for(auto v : G[u]) {
dfs(v, max(anc, u));
bit.add(M[v], f[M[v]]);
}
for(auto v : G[u]) {
bit.add(M[v], mod - f[M[v]]);
}
bit.add(u, mod - f[u]);
}
void Main() {
cin >> n;
for(int i = 1; i <= n; i++) {
G[i].clear();
f[i] = M[i] = 0;
}
for(int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v), G[v].push_back(u);
}
pre_dfs(1, -1), dfs(1, 1);
cout << f[n] << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T; cin >> T;
while(T--) {
Main();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?