20241002

news/2024/10/2 19:51:51

bwtree

我们可以设 \(dp_{i, 0/1}\) 表示当前考虑至哪个点,这个节点的子树内选了几个叶子节点

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5, INF = 1e9;int n, a[N], dp[N][2];vector<int> g[N];void dfs(int u, int f) {dp[u][0] = (a[u] == 1);dp[u][1] = (a[u] == 0);if ((g[u].size() == 1 && g[u][0] == f) || g[u].size() == 0) {return ;}for (auto v : g[u]) {if (v == f) {continue;}dfs(v, u);}int ans = 0, tot = 0, mini = INF;for (auto v : g[u]) {if (v == f) {continue;}if (dp[v][0] > dp[v][1]) {ans += dp[v][0];}else {ans += dp[v][1];tot += 1;}mini = min(mini, max(dp[v][0], dp[v][1]) - min(dp[v][0], dp[v][1]));}dp[u][tot % 2] += ans;dp[u][(tot + 1) % 2] += ans - mini;
}int main() {ios::sync_with_stdio(0);cin.tie(0);freopen("bwtree.in", "r", stdin);freopen("bwtree.out", "w", stdout);cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}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 << max(dp[1][0], dp[1][1]);return 0;
}

prison

一眼题,但是忘了 \(tarjan\) 如何写,答案就是强连通分块数量,连接不同强连通分量之间的边数

#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 1e5 + 5;int n, m, dfn[N], cnt, ans, res[N], a[N], tot;bool vis[N];vector<int> g[N];stack<int> stk;void dfs(int u) {dfn[u] = ++cnt;res[u] = dfn[u];vis[u] = true;stk.push(u);for (auto v : g[u]) {if (!dfn[v]) {dfs(v);res[u] = min(res[u], res[v]);}else if (vis[v]) {res[u] = min(res[u], dfn[v]);}}if (res[u] == dfn[u]) {tot++;while (stk.top() != u) {a[stk.top()] = tot;vis[stk.top()] = false;stk.pop();}a[u] = tot;vis[u] = false;stk.pop();}
}signed main() {freopen("prison.in", "r", stdin);freopen("prison.out", "w", stdout);cin >> n >> m;for (int i = 1, opt, u, v; i <= m; i++) {cin >> opt >> u >> v;if (opt == 0) {g[u].push_back(v);g[v].push_back(u);}else {g[u].push_back(v);}}for (int i = 1; i <= n; i++) {if (!dfn[i]) {dfs(i);}}for (int i = 1; i <= n; i++) {for (auto v : g[i]) {ans += (a[v] != a[i]);}}cout << tot << " " << ans;return 0;
}

placement

我们来拆式子

\[a[i] \times i - b[i] \times (n - i + 1) \\ a[i] \times i - b[i] \times n + b[i] \times i - b[i]\\ (a[i] + b[i]) \times i - (n + 1) \times b[i] \]

那么式子中的 \(b[i] \times (n + 1)\) 就是确定的了,所以我们只需要关心 \(a[i] + b[i]\),更具式子,显然我们要让 \(a[i] + b[i]\) 大的靠后放,那么我们想让答案最大的形式就已经确定了,我们只能交换 \(a[i] + b[i]\) 相等的数,此题完结

#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 1e5 + 5, mod = 1e9 + 7;struct node {int a, b;
}x[N];int n, inv[N], ans = 1;bool cmp(node _x, node _y) {return _x.a + _x.b < _y.a + _y.b;
}signed main() {freopen("placement.in", "r", stdin);freopen("placement.out", "w", stdout);cin >> n;for (int i = 1; i <= n; i++) {cin >> x[i].a;}for (int i = 1; i <= n; i++) {cin >> x[i].b;}inv[1] = 1;for (int i = 2; i <= 100000; i++) {inv[i] = inv[i - 1] * i % mod;}sort(x + 1, x + n + 1, cmp);for (int i = 1; i <= n; i++) {if (x[i].a + x[i].b != x[i - 1].a + x[i - 1].b) {int p = i;while (p <= n && x[p].a + x[p].b == x[i].a + x[i].b) {p++;}ans = ans * inv[p - i] % mod;}}cout << ans;return 0;
}

hierarchy

我们可以维护一堆\(set\),表示职级为 \(a\) 的工资有哪些,\(set\) 为大根堆,我们还可以开一个线段树维护职级为 \([l, r]\) 的最大工资,然后我们在每次往下递归时每次从 \(set\)里删除掉,然后再在回溯时加上即可,然后我们在每次删掉是更新一下线段树

#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 5;int t, n, a[N], b[N], maxia[N], maxib[N], c[N], p[N], cnt, tr[N * 4];vector<int> g[N];multiset<int, greater<int>> s[N];bool flag;void build(int i, int l, int r) {if (l == r) {if (!s[l].empty()) {tr[i] = *s[l].begin();}else tr[i] = 0;return ;}int mid = (l + r) >> 1;build(i * 2, l, mid);build(i * 2 + 1, mid + 1, r);tr[i] = max(tr[i * 2], tr[i * 2 + 1]);
}void modify(int i, int l, int r, int p) {if (l == r) {if (!s[l].empty()) {tr[i] = *s[l].begin();}else tr[i] = 0;return ;}int mid = (l + r) >> 1;if (mid >= p) {modify(i * 2, l, mid, p);}else modify(i * 2 + 1, mid + 1, r, p);tr[i] = max(tr[i * 2], tr[i * 2 + 1]);
}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 dfs(int u, int f) {for (auto v : g[u]) {if (v == f) {continue;}dfs(v, u);maxia[u] = max(maxia[v], maxia[u]);maxib[u] = max(maxib[v], maxib[u]);}if (maxia[u] > a[u] || maxib[u] > b[u]) {flag = false;}maxia[u] = a[u], maxib[u] = b[u];
}void dfs1(int u, int f) {s[a[u]].erase(s[a[u]].find(b[u]));modify(1, 1, cnt, a[u]);for (auto v : g[u]) {if (v == f) {continue;}dfs1(v, u);}int tmp = query(1, 1, cnt, a[u], cnt);if (tmp >= b[u]) {flag = false;}s[a[u]].insert(b[u]);modify(1, 1, cnt, a[u]);
}void Solve() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i] >> b[i];c[i] = a[i];g[i].clear();maxia[i] = 0, maxib[i] = 0;s[i].clear();}cnt = 0;sort(c + 1, c + n + 1);for (int i = 1; i <= n; i++) {if (c[i - 1] != c[i]) p[++cnt] = c[i];}for (int i = 1; i <= n; i++) {a[i] = lower_bound(p + 1, p + cnt + 1, a[i]) - p;s[a[i]].insert(b[i]);}build(1, 1, cnt);for (int i = 1, u, v; i < n; i++) {cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}flag = true;dfs(1, 0);dfs1(1, 0);if (!flag) {cout << "NO\n";}else cout << "YES\n";
}int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> t;while (t--) {Solve();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

git学习笔记 1

1、安装配置 git 安装:https://git-scm.com/book/zh/v2/起步-安装-Git 文档:https://git-scm.com/docs 初次配置git config --global user.name "你的名字"git config --global user.email "你的邮箱"检测配置是否成功 git config --list在里面找到 user…

高级语言程序设计课程第二次作业

班级链接:https://edu.cnblogs.com/campus/fzu 作业要求链接:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 学号:102400204 姓名:刘嘉奕 3.11编程作业 作业1目标:观察系统如何处理整数上溢,浮点数上溢,浮点数下溢作业2作业3双引号的打印需要使用转义序列作…

CF589H Tourist Guide

昨晚码敲完了没保存,导致还原卡直接把我码肘没了。。。 气死了只能重新敲了一遍。 题面 Tourist Guide 分析 考虑每一个联通块分开处理。 先将每一个联通块变为生成树,任意生成方式皆可。 对于每一个联通块,一定可以构造一种组合方法,使得该联通块中最多只有一个关键点无法…

2024新生赛-Week1

F12 快捷键f12直接查看字符串 xor 了解一下XOR运算,AB=C,CA=B 使用a数组对输入的字符进行循环运算取出最终的字符串再进行一次xor即可得到flag Ezencode进入加密函数后发现是一个base64算法,对表进行了替换,最后有对编码得到的结果进行异或操作. 提出最后的密文,进行异或,换表,…

DAY2-补题

我补题AK了,但你出言不逊是 非常好的一套题,让我的大脑旋转啊。 不太想开一个文章单独屑,所以扔到随笔里面。 敲字速度有待加强。 说在前面 题目难度单调递减,分数单调递减。果然屑死了。 T1再次读题失误,正确的来说是代码敲得非常抽象。T2DP但没骗到分非常不好,T3场上想…

独立站如何批量查收录,教你独立站如何批量查收录的方法操作步骤

独立站批量查收录是SEO优化工作中的重要环节,有助于网站管理员或SEO人员及时了解网站在搜索引擎中的表现,从而制定针对性的优化策略。以下是一些常用的独立站批量查收录的方法及其操作步骤: 一、使用搜索引擎的Site指令结合自动化脚本 编写脚本或配置爬虫: 利用Python、She…

04-论说文:审题与立意(1)

命题作文 比较开放 近义词 相关性 竞争 合作 竞争合作 ==》 竞争合作的关系 概率==》风险 风险 利益 审题 较难

南沙C++信奥赛陈老师解一本通题 1966:【14NOIP普及组】比例简化

​【题目描述】在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有 1498 人,反对的有 902 人,那么赞同与反对的比例可以简单的记为1498:902。 不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例…