20240923

news/2025/11/7 8:48:43/文章来源:https://www.cnblogs.com/libohan/p/18447263

Bouquet

我们可以设计一个状态 \(dp_i\) 表示前 \(i\) 朵花内最多可以选多少朵花,如果第 \(j\) 朵花和第 \(i\) 多花不冲突,要满足以下条件

\[r_j < i 且 l_i > i \]

那么我们可以在 \(r_j\) 时再让 \(j\) 的转移合法,那么只用 \(1 \le j \le r_i\) 那么带修的区间查询是什么数据结构?线段树

#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 2e5 + 5;int n, tr[N * 4], l[N], r[N], dp[N];vector<pair<int, int>> v[N];int query(int i, int l, int r, int x, int y) {if (x > y) {return 0;}if (l > y || r < x) {return 0;}if (l >= x && r <= y) {return tr[i];}int mid = (l + r) >> 1;return max(query(i * 2, l, mid, x, y), query(i * 2 + 1, mid + 1, r, x, y));
}void change(int i, int l, int r, int p, int x) {if (l == r) {tr[i] = x;return ;}int mid = (l + r) >> 1;if (mid >= p) {change(i * 2, l, mid, p, x);}else change(i * 2 + 1, mid + 1, r, p, x);tr[i] = max(tr[i * 2], tr[i * 2 + 1]);
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> l[i] >> r[i];l[i] = max(0ll, i - l[i]);r[i] = min(n, i + r[i]);}int ans = 0;for (int i = 1; i <= n; i++) {for (auto cur : v[i]) {change(1, 1, n, cur.first, cur.second);}dp[i] = query(1, 1, n, 1, l[i] - 1) + 1;ans = max(ans, dp[i]);v[r[i] + 1].push_back({i, dp[i]});}cout << ans;return 0;
}

龙门对决

我也不会,我太菜了,我还没听懂

#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 5e5 + 5, mod = 998244353;int n, dp[N][2], ans;vector<int> g[N];void dfs(int u, int f) {dp[u][1] = 1;vector<int> sum1, sum2, e;sum1.resize(g[u].size() + 5);sum2.resize(g[u].size() + 5);e.push_back(0);for (auto v : g[u]) {if (v == f) {continue;}dfs(v, u);dp[u][1] *= (dp[v][0] + 1);dp[u][1] %= mod;e.push_back(v);}sum1[0] = 1, sum2[e.size()] = 1;for (int i = 1; i < e.size(); i++) {sum1[i] = sum1[i - 1] * (dp[e[i]][0] + 1);sum1[i] %= mod;}for (int i = e.size() - 1; i > 0; i--) {sum2[i] = sum2[i + 1] * (dp[e[i]][0] + 1);sum2[i] %= mod;}int cnt = 0;for (auto v : g[u]) {if (v == f) {continue;}cnt++;dp[u][0] += dp[v][1] * sum1[cnt - 1] % mod * sum2[cnt + 1] % mod;dp[u][0] %= mod;}ans = (ans + dp[u][0]) % mod;
}signed main() {cin >> n;for (int i = 1, u, v; i < n; i++) {cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);cout << ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808068.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博弈论二次回顾

主要是一些模型。 ICG的定义双方轮流移动 不能行动者判负 所能进行的操作仅与当前局面有关,与操作者无关一般而言发现 ICG 就可以考虑 SG 了。 SG 分清楚 后继状态 和 子游戏。 子游戏的和是 \(\oplus\),后继状态的和是 \(mex\)。 后继状态 指进行一次操作所能够达到的状态。…

JOI 2020 Final

A - 長いだけのネクタイ (Just Long Neckties)JOI 公司开了一个派对。有 \(n + 1\) 条领带,第 \(i\) 条领带的长度是 \(a_i\)。有 \(n\) 名员工,第 \(i\) 名员工适合长度不超过 \(b_i\) 的领带。 对于一种将 \(n\) 条领带配对给 \(n\) 的人的方案,设第 \(i\) 条领带匹配了第…

【真题研究】春季测试 2023

T1.涂色游戏(paint) 可以按照题意模拟,每一次暴力对于每一行列染色,时间复杂度 \(O(qn)\)。可得60pts。 因为颜色可以覆盖,某一格的颜色往往取决于最后一次被染到的颜色。 于是我们采用打标记的方式。每一次染色(行或列)就在当前行列打标记,记操作时间戳 \(t\)。 最后输…

20240924

[牛半仙的妹子 Tree(tree)](http://ac.robo-maker.cn/d/contest/p/ZY1044?tid=66f28cd11bca2159e88c8fb0) 我们会发现其实牛半仙发癫时就等于将以前的标记清空,从头开始,所以我们可以考虑根号分治,如果两个牛半仙发癫的时间间隔小于 \(\sqrt n\) ,那么我们可以直接暴力枚举两…

喜报

\(20080919\) 是质数

[PEP] [技巧] LATEX 公式手册

这种东西,当然是转载了 樱花赞 LaTeX公式手册(全网最全) 链接同时也是出处;

『模拟赛』冲刺CSP联训模拟2

『模拟赛记录』冲刺CSP联训模拟2Rank 不重要了A. 挤压 你说的对,期望怎么能算签呢? 一个重要的性质:一个数的平方可以在二进制下表示为 \(\sum_{i,j}\ s_i\ s_j\ 2^{i+j}\),所以就可以分别求每一位对答案的贡献了。 设 \(f_{i,1/0,1/0}\) 表示到第 \(i\) 个数我们枚举的两位…