codeforces round974 div3 分层图 树形dp

A  Robin Helps

问题:

思路:模拟

代码:

#include <bits/stdc++.h>
using namespace std;const int N = 2e5 + 10;void solve() {int n, k;cin >> n >> k;vector<int> a(n + 1);for(int i = 1; i <= n; i ++ ) cin >> a[i];int sum = 0;int cnt = 0;for(int i = 1; i <= n; i ++ ) {if(a[i] >= k) sum += a[i];else if(a[i] == 0 && sum != 0) {sum --;cnt ++;}}cout << cnt << endl;
}int main() {int t;cin >> t;while(t -- ) solve();
}
/*
2
1
-1
4
2
-1
*/ 

B Robin Hood and the Major Oak

问题:

思路:注意到i^{i}的奇偶性只与$i$有关 因此前$i$天树叶的和的奇偶性我们可以很容易的得到,并且叶子只能存活m天,所以只需判断$n - m + 1$$n$天叶子的奇偶性即可

代码:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int N = 2e5 + 10;void solve() {int n, k;cin >> n >> k;/*vector<ll> a(N + 1);for(int i = 1; i <= n / i; i ++ ) a[i] = i * i;*/int num = 0;if(n & 1) num = (n + 1) / 2;else num = n / 2;int num1 = 0;if((n - k) & 1) num1 = (max(0, (n - k)) + 1) / 2;else num1 = max(0, (n - k)) / 2;if((num0 - num1) & 1) cout << "NO\n";else cout << "YES\n";
}int main() {int t;cin >> t;while(t -- ) solve();
}

C  Robin Hood in Town

思路:

二分答案,然后在check函数中判断这个结果是否可行

代码:

#include <bits/stdc++.h>
using namespace std;const int N = 2e5 + 10;
const double eps = 1e-8;void solve() {int n;cin >> n;vector<long long> a(n + 1);for(int i = 1; i <= n; i ++ ) cin >> a[i];sort(a.begin() + 1, a.end());auto check = [&](long long mid) {//mid = 0;a[n] += mid;double sum = 0;for(int i = 1; i <= n; i ++ ) sum += a[i];int cnt = 0;double avg = sum / n;avg /= 2;for(int i = 1; i <= n; i ++ ) {if(a[i] + eps < avg) cnt ++;}a[n] -= mid;//cout << cnt << " ";return cnt >= n / 2 + 1;};//check(0);//if(check(0)) cout << 11111;long long l = 0, r = 1e16;while(l < r) {long long mid = l + r >> 1;if(check(mid)) r = mid;else l = mid + 1;}if(check(l)) cout << l << "\n";else cout << "-1\n";
}int main() {int t;cin >> t;while(t -- ) solve();
}

D robert hood and mrs hood

问题:

思路:

这道题目本质上是求一段区间内,最多和最少能包含多少个事件。首先可以通过差分的方式求出每个时间点当前包含多少事件,然后从该点开始向后扫描要扫描的区间长度,每碰见一个事件开始的左端点那么该段区间内事件数加1,第二层循环可以用前缀和优化掉,预处理出每个点之前有多少事件开始的左端点。

代码:
 

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int N = 2e5 + 10;
const double eps = 1e-8;void solve() {int n, d, k;cin >> n >> d >> k;vector<pair<int, int>> a(k + 1);for(int i = 1; i <= k; i ++ ) {int l, r;cin >> l >> r;a[i] = {l, r};}sort(a.begin() + 1, a.end());vector<ll> diff(n + 2);//每个点被几个区间覆盖for(int i = 1; i <= k; i ++ ) {int l = a[i].first;int r = a[i].second;diff[l] += 1;diff[r + 1] -= 1;}for(int i = 1; i <= n; i ++ ) diff[i] += diff[i - 1];vector<ll> sum(n + 1);for(int i = 1; i <= k; i ++ ) {sum[a[i].first] ++;}/*for(int i = 1; i <= n; i ++ ) cout << sum[i] << " ";cout << endl;for(int i = 1; i <= n; i ++ ) cout << diff[i] << " ";*/for(int i = 1; i <= n; i ++ ) sum[i] += sum[i - 1];ll minv = 0x3f3f3f3f, maxv = 0;int pos1 = 1, pos2 = 1;for(int i = 1; i <= n - d + 1; i ++ ) {ll num = sum[i + d - 1] - sum[i] + diff[i];if(num > maxv) {maxv = num;pos1 = i;}if(num < minv) {minv = num;pos2 = i;}}cout << pos1 << " " << pos2 << endl;
}int main() {int t;cin >> t;while(t -- ) solve();
}

E Rendez-vous de Marian et Robin

问题:

思路:分层图,第一层图的边权为均为w,第二层图的边权均为w / 2,第一层图的点i与第二层图的点i + n对应,由于骑上马之后一定比骑上马再下马更优,因此两层图之间用单向边连接,即,如果在点i上有马,那么就在i与i + n之间连一条边权为0的单向边。最后从点1和点n分别跑dijkstra即可。最后一个点的最短时间就是min(dis[i], dis[i + n])。记得开long long

代码:

#include <bits/stdc++.h>
using namespace std;typedef long long ll;void solve() {int n, m, h;cin >> n >> m >> h;vector<vector<pair<int, int>>> adj(2 * n + 1); for(int i = 1; i <= h; i ++ ) {int x;cin >> x;adj[x].push_back({x + n, 0});}while(m -- ) {int u, v, w; cin >> u >> v >> w;adj[u].push_back({v, w});adj[v].push_back({u, w});adj[u + n].push_back({v + n, w / 2});adj[v + n].push_back({u + n, w / 2});}vector<bool> st(2 * n + 1);auto dijkstra = [&](int start, vector<ll> &dis) {dis[start] = 0;priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> q;q.push({0ll, start});while(!q.empty()) {auto t = q.top();q.pop();ll dist = t.first, ver = t.second;if(st[ver]) continue;st[ver] = true;for(auto t: adj[ver]) {if(dis[t.first] > dist + t.second) {dis[t.first] = dist + t.second;q.push({dis[t.first], t.first});}}}};vector<ll> dis(2 * n + 1, 1e18), redis(2 * n + 1, 0x3f3f3f3f);dijkstra(1, dis);for(int i = 1; i <= 2 * n; i ++ ) st[i] = false;dijkstra(n, redis);ll ans = 1e18;for(int i = 1; i <= n; i ++ ) {ans = min(ans, max(min(dis[i], dis[i + n]), min(redis[i], redis[i + n])));}if(ans == 1e18) cout << "-1\n";else cout << ans << "\n";
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t;cin >> t;while(t -- ) solve();return 0;
}

F sheriff's defences

问题:

思路:首先注意到这个图只有n - 1条边,并且是连通的,也就是说这是一棵树。然后对于一个点,如果这是一个单独被保护起来的点,那么这个点对答案的贡献实际上就是自身拥有的gold。如果这是多个连续的被保护的点,这里以两个点为例,对答案的贡献就是gold - c - c其中一个c表示本身被相邻的点抢走的gold,另一个c表示相邻那个点被这个点抢走的gold。这就和没有上司的舞会差不多了,dp[i][2]表示第i个营地我是否保护,dp[i][0]表示不保护, dp[i][1]表示保护 

那么状态转移可表示为:

dp[i][0] += max(dp[son][0], dp[son][1])

$dp[i][1] += max(dp[son][0], dp[son][1] - 2 * c)$

代码:
 

#include <bits/stdc++.h>
using namespace std;typedef long long ll;void solve() {int n, c;cin >> n >> c;vector<ll> a(n + 1);for(int i = 1; i <= n; i ++ ) cin >> a[i];vector<vector<int>> adj(n + 1);for(int i = 1; i <= n - 1; i ++ ) {int u, v;cin >> u >> v;adj[u].push_back(v);adj[v].push_back(u);}vector<vector<ll>> dp((n + 1), vector<ll>(3));function<void(int, int)> dfs = [&](int u, int fa) -> void {dp[u][1] = a[u];for(auto t: adj[u]) {if(t == fa) continue;dfs(t, u);dp[u][0] += max(dp[t][1], dp[t][0]);dp[u][1] += max(dp[t][0], dp[t][1] - 2 * c);}};dfs(1, 1);cout << max(dp[1][1], dp[1][0]) << "\n";
}int main() {ios::sync_with_stdio(false);int t;cin >> t;cin.tie(0), cout.tie(0);while(t -- ) solve();return 0;
}

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

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

相关文章

9.23 My_string.cpp

my_string.h #ifndef MY_STRING_H #define MY_STRING_H#include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; //字符串的最大容量int len; //字符串当前…

车载视频监控:安全生产与管理的新趋势

随着社会的快速发展&#xff0c;车载视频监控技术已成为现代安防领域不可或缺的一部分。车载视频监控设备是专为车载安防设计的新型视频监控设备&#xff0c;其安装已经成为社会发展的必然趋势。对于企业的安全生产和管理来说&#xff0c;车载视频监控设备起着至关重要的作用。…

wpf,工具栏上,最小化按钮的实现

工具栏上&#xff0c;最小化按钮的实现。工具栏做成的是用户控件。 用户控件的xaml <Button HorizontalAlignment"Right" Height"32" Click"MinimizeClick" /> 用户控件的cs代码 private void MinimizeClick(object sender, RoutedEven…

2024年408真题计算机网络篇

1 https://zhuanlan.zhihu.com/p/721169467。最小割可以看作是切断水流的最薄弱环节——通过切断这些关键的“水管”&#xff0c;就可以完全阻止水从源点流到汇点。 在下列二进制数字调制方法中&#xff0c;需要2个不同频率载波 的是 A. ASK B. PSK C. FSK D. DPSK 解答…

【行为树】02-基础的端口

Input and Output Ports 输入和输出端口 正如我们之前解释的那样,自定义的TreeNodes可以用于执行任意简单或复杂的软件。它们的目标是提供一个具有更高抽象层级的接口。 因此,它们在概念上与函数没有不同。 类似于函数,我们经常想要: 将参数传递给一个节点(inputs)从一…

论文Query2Label: A Simple Transformer Way to Multi-Label Classification

本文将Transformer解码器用于多标签分类&#xff0c;将label embedding作为query&#xff0c;计算与feature map的cross-attention&#xff0c;取得了SOTA结果。 论文&#xff1a;https://arxiv.org/pdf/2107.10834.pdf 代码&#xff1a;https://github.com/SlongLiu/query2lab…

洛谷-P3916 图的遍历

题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求A(v) 表示从点 v 出发&#xff0c;能到达编号最大的点。 思路 既然是要找到最大的点&#xff0c;那么我从最大的点开始DFS是否可以&#xff1f; 于是可以反向建图&#xff0c;然后从最…

Excel的基本应用 ___2

快速插入函数 方法一&#xff1a; 方法二&#xff1a;快捷键 Alt&#xff1a;求和 动态查看 利用函数清单选择函数 相对地址和绝对地址的转换 FnF4

寻觅义乌自闭症学校:了解寄宿制教育的选择

在义乌乃至全国范围内&#xff0c;为自闭症儿童寻找一所合适的学校&#xff0c;是许多家庭面临的重大挑战。随着特殊教育的发展&#xff0c;越来越多的寄宿制学校以其独特的优势和全面的教育体系&#xff0c;为这些特殊的孩子提供了更加专业和细致的关怀。今天&#xff0c;我们…

MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官

知识点思维导图 案例1 建表语句与模拟数据 用户表 users CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, signup_date DATE NOT NULL ); INSERT INTO users (username, email, signu…

9月23日

思维导图 作业 统计家目录下.c文件的个数 #!/bin/bashnum0for file in ~/*.c; doif [ -f "$file" ]; then((num))fi doneecho "家目录下.c文件的个数: $num"

多个异构系统用户权限如何统一管理?

企业内部往往部署了多个业务系统来支撑不同的业务流程&#xff0c;然而&#xff0c;这些系统之间的标准不一&#xff0c;导致跨系统操作时权限不透明&#xff0c;难以确保数据安全与合规操作。同时&#xff0c;频繁的权限变更与维护工作量大且效率低&#xff0c;给企业带来了诸…

基于单片机的智能窗帘控制系统-设计说明书

设计摘要&#xff1a; 智能窗帘控制系统是一种利用单片机技术实现的智能化控制系统&#xff0c;可以实现窗帘的自动开合和定时控制功能。本系统的设计基于单片机技术&#xff0c;结合传感器、电机和执行器等硬件设备&#xff0c;实现对窗帘的智能化控制。通过传感器采集环境信…

电动车车牌识别系统源码分享

电动车车牌识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

微服务架构的挑战与解决方案 —— Spring Cloud

文章目录 微服务架构的挑战与解决方案 —— Spring Cloud挑战微服务挑战解决方案 - Spring Cloud什么是Spring CloudSpring Cloud 版本Spring Cloud实现方案Spring Cloud NetflixSpring Cloud Alibaba 微服务架构的挑战与解决方案 —— Spring Cloud 挑战 服务依赖复杂性 随着…

Jetpack Compose 增强辅助工具(4)

导读大纲 1.1 探索 Compose 工具1.1.1 Compose Preview: 实时 UI 界面1.1.2 Interactive Mode: 测试UI行为1.1.3 其他实用功能 1.1 探索 Compose 工具 Android Studio 提供一套功能强大的工具 专门用于增强 Jetpack Compose 的开发体验 这些工具可以简化工作流程,提供实时反馈…

EC Shop安装指南 [ Apache PHP Mysql ]

这个是软件测试课上老师布置的一个作业&#xff0c;期间老师也出现了不少错误&#xff0c;所以还是有必要记录一下吧&#xff0c;凑一篇文章 主要是老师的文档以及自己的一些尝试记录&#xff0c;试错记录&#xff0c;解决方案等 主要介绍了Apache的安装&#xff0c;MySQL的安…

【27】C++项目练习

练习1 题目如下 代码如下 .h #pragma once #include <string> using namespace std;class Toy { public:Toy();Toy(string name,int price,string place);~Toy();string getName() const;int getPrice() const;string getPlace() const;void changePrice(float count)…

Games101笔记-二维Transform变换(二)

1、什么是Transform Transform就是通过一个矩阵&#xff0c;进行缩放、旋转、平移等变换 2、缩放、旋转、切变、平移等基础变换 缩放变换&#xff1a; 反射变换&#xff1a; 切变&#xff1a; 绕原点旋转&#xff1a; 以上都是线性变换&#xff1a; 平移变换&#xf…

比核废水更严重更值得关注的可能是日常饮水这件事

7月16日 核污水排海已经完成第7轮 核污水的危害很大 据东京电力公司称&#xff0c;此次的核污水中浓度超标的放射性元素有64种之多。虽然经过处理&#xff0c;除氚之外的62种放射性物质达到日本国家环境排放标准&#xff0c;但更危险的放射性元素比如碳-14、碘-129等&#xf…