CF2122

news/2025/11/23 16:13:11/文章来源:https://www.cnblogs.com/Hengqwq/p/19260693

CF2122D Traffic Lights

如果只有第一问的话,每个点分 \(\operatorname{deg}\) 个点跑分层图即可,但是在第二问这个就很没有道理了,因为是可以通过来回走来节省等待时间的。
所以每个点必须分成 \(t\) 个点。那么我们考虑一下第一问答案的上限。考察一条 \(1 \to n\) 经过 \(k\) 条边的最短路(就是边的数量最少),他的答案上限是 \(\sum \operatorname{deg}(u)\)。首先路径上的点之间肯定只能相邻的两个有边,否则就不是最短路了;其次对于不在这条路径上的 \(n - k\) 个点,最多向路径上的 3 个点连边,要不然也不是最短路了。这样就是 \(2 \times (k - 1) + 3 \times (n - k) = 3n - 2 - k \le 3n\)
所以我们只需要跑 \(t \le 3n\) 的即可,这下也没必要跑最短路了,因为这样拆点之后是一个 DAG,直接二维 dp,复杂度 \(O(n^2 + m)\)

Code
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5, inf = 1e9;
int f[N][2], n, m;
vector<int> e[N];
void chmin(int &x, int y){ x = min(x, y); }
void solve(){cin >> n >> m;for(int i = 1; i <= n; ++i) e[i].clear();for(int i = 1; i <= m; ++i){int u, v; cin >> u >> v;e[u].emplace_back(v);e[v].emplace_back(u);}int nw = 0;for(int i = 1; i <= n; ++i) f[i][1] = inf;f[1][1] = 0;for(int t = 0; t <= 3 * n; ++t){nw ^= 1;for(int i = 1; i <= n; ++i) f[i][nw ^ 1] = inf;for(int i = 1; i <= n; ++i){if(i == n && f[i][nw] != inf){cout << t << ' ' << f[i][nw] << '\n';return;}chmin(f[i][nw ^ 1], f[i][nw] + 1);int v = e[i][t % e[i].size()];chmin(f[v][nw ^ 1], f[i][nw]);}}
}
int main(){cin.tie(nullptr)->sync_with_stdio(0);int T; cin >> T;while(T--) solve();return 0;
}

CF2122E Greedy Grid Counting

记第一行的 \(n\) 个数是 \(a_i\),第二行的 \(n\) 个数是 \(b_i\)
我们先考察单个子矩形的情况,假设是 \(2 \times k\) 的。考虑调整,1 处转弯的答案是 \(M = a_1 + \sum_{i = 1}^k b_i\),如果记录 \(c_i = a_{i} - b_{i - 1}(i > 1), c_1 = 0\),那么 \(i\) 处转弯的答案是 \(M + \sum_{j \le i} c_j\)
\(i\) 处转弯意味着 \(c_{i + 1} < 0\)。而为了让这条 Greedy Path 是最大的,这之后的 \(\forall j \ge i + 1, \sum_{p = i + 1}^j c_p \le 0\)
然后卡住了。实际上由于我们要求任意子矩形内都要满足这一条件,我们只需要所有相邻的两个 \(c_i,c_j < 0\) 之间的 \([i,j)\) 之间的和 \(\le 0\)。关注这个还有一个好处,就是 \((i, j)\) 中的所有数都是 \(\ge 0\) 的,也就是和会越来越大。这样就好 dp 了,\(f_{i, j}\) 表示前 \(i\) 个,到上一个 \(c_k < 0\) 之间所有数的和是 \(j(j \le 0)\)。第 \(i\) 个位置 \(c_i = x\) 的方案数是好求的,直接 \(O(k^2)\) 枚举 \(a_{i + 1}\)\(b_i\) 一遍。同时还需要一个 \(g_i\) 表示只选 \(\ge 0\)。那么选一个 \(c_i < 0\) 就相当于重置,否则就是更新第二维。第二维开到 \(k\) 就行,因为这个和最小就是 \(c_i\) 的最小值 \(-k\)(中间只递增嘛)。
复杂度 \(O(nk^2)\),特判一下 \(a_1\)\(b_n\)

Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e2 + 5, mod = 998244353;
int n, k;
ll f[N][N], a[N], b[N], ways[2 * N], g[N];
void add(ll &a, ll b){ (a += b) %= mod; }
void solve(){cin >> n >> k;for(int i = 1; i <= n; ++i) cin >> a[i];for(int i = 1; i <= n; ++i) cin >> b[i];g[1] = (a[1] == -1 ? k : 1);for(int i = 2; i <= n; ++i){int la, ra, lb, rb;if(a[i] == -1) la = 1, ra = k;else la = ra = a[i];if(b[i - 1] == -1) lb = 1, rb = k;else lb = rb = b[i - 1];for(int i = 0; i <= 2 * k; ++i) ways[i] = 0;for(int x = la; x <= ra; ++x){for(int y = lb; y <= rb; ++y){int c = x - y;ways[c + k]++;}}ll sum = 0;for(int j = 0; j <= k; ++j) f[i][j] = 0, add(sum, f[i - 1][j]);for(int j = 0; j < k; ++j){int c = j - k;f[i][-c] = ways[j] * (sum + g[i - 1]) % mod;}g[i] = 0;for(int o = k; o <= 2 * k; ++o){add(g[i], g[i - 1] * ways[o] % mod);}for(int j = 0; j <= k; ++j){for(int o = k; o <= 2 * k; ++o){int c = o - k;if(j + c <= k){add(f[i][j], f[i - 1][j + c] * ways[o] % mod);}}}// for(int j = 0; j <= k; ++j){//     cout << i << ' ' << j << ' ' << f[i][j] << '\n';// }// cout << g[i] << ' ' << g[i - 1] << '\n';}ll ans = g[n];for(int i = 0; i <= k; ++i) add(ans, f[n][i]);cout << ans * (b[n] == -1 ? k : 1) % mod << '\n';
}  
signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int T; cin >> T;while(T--) solve();return 0;
}

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

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

相关文章

《d2l Chapter4 多层感知机基础内容》

通俗细节讲解多层感知机基础原理,以及实际运用,并附有Latex数学公式与细节代码实现Chapter 4 : 多层感知机(MLP)先看看这个原理简单的嵌套式的“双层”的线性回归 \[\mathbf{X} \in \mathbb{R}^{n \times d} \]表示…

洛谷P2678题解

P2678虽然是黄题,但是只要想通思路,就会变得异常简单。 以下是思路《跳石头》算法思路详解.url100分错1个点代码:点击查看代码 #include<bits/stdc++.h> using namespace std; int L,N,M,d[50005]; bool chec…

【JVM】详解 Class类文件的结构 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验3_CPP

任务1 源代码 button.hpp #pragma once#include <iostream> #include <string>class Button { public:Button(const std::string &label_);const std::string& get_label() const;void click();pr…

longchain4j 学习系列(4)-mcp调用

继续学习langchain4j,以下是langchain4j 调用MCP的示例: 1、添加pom依赖1 <dependency> 2 <groupId>dev.langchain4j</groupId> 3 <artifactId>langchain4j-mcp</artifactId>…

Java 学习路线可按「基础→进阶→实战→架构」四阶段推进

一、基础入门阶段(1-2个月) 核心目标:掌握Java语法和基本编程思维,能独立写简单程序。 核心知识点: 环境搭建(JDK安装、IDEA使用、环境变量配置) 基础语法(变量、数据类型、运算符、流程控制、数组) 面向对象…

Jetson Orin Nano super -2 烧录概念及必要性

一、什么是烧录?(核心定义) 烧录(又称 “写入”“刷写”)是指 将预先打包好的系统镜像、程序固件或驱动文件,通过专用工具和协议,写入嵌入式设备(如 Jetson 开发板、单片机)的存储介质(如 eMMC、SD 卡、NVMe…

blog搬迁

博客已经搬迁到https://langx1ng.github.io/处我要吃炸鸡

102302122许志安作业3

要求:指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 代码如下: import os import requests from bs4 import BeautifulSoup from u…

iPhone14系列电池容量多少毫安

iPhone 14:3279mAhiPhone 14 Plus:4325mAhiPhone 14 Pro:3200mAhiPhone 14 Pro Max:4323mAh作为对比iPhone 13 / Pro 系列电池容量:iPhone 13 mini:2406mAhiPhone 13:3227mAhiPhone 13 Pro:3095mAhiPhone 13 P…

ipc linux

在 Linux 中,IPC(Inter-Process Communication,进程间通信) 是一种让不同进程之间进行数据交换和协作的机制。常见的 IPC 方式包括:1. 管道(Pipe)用途:用于父子进程之间传递数据。命令示例:cat file1 | grep …

读 《d2l:Chapter3. 线性神经网络 》随笔

讲一下Softmax回归 先说说自带mnist等库中的one-hot encoding 就是:一个向量,分量 (Row) == 类别 如: A、B、C 对应 \((1, 0, 0)\)、\((0, 1, 0)\)、\((0, 0, 1)\) 注:全连接层: 不同层使用线性连接 \(softmax\)运…

错排的

1.关键错排的理解 当1不放在k时 n个元素去掉k而k原来的位置可以看成1现在的位置(不能放的)变成了n-1个元素的错排 2.记忆化搜索 你后面要写函数啊 include <bits/stdc++.h> using namespace std; long long dp…

ipad学linux

iPad 并不是 Linux 系统,它是一款 iOS 设备,运行的是 Apple iOS 操作系统。因此,无法直接在 iPad 上运行 Linux。不过,你可以通过以下几种方式在 iPad 上使用 Linux:? 一、在 iPad 上运行 Linux(通过虚拟机或容…

iPadOS16有什么新功能

1、信息 App 为用户带来高效协作新方式2、一款协作类新 App 全面支持 Apple Pencil,让用户能在同一块灵活的画布上实时进行查看、分享和协作3、邮件 App 推出的全新搜索功能可得到相关性更高、更准确、更完整的搜索结…

ipad linux

您提到的 "iPad Linux" 实际上是 iPad 无法直接运行 Linux 的一个常见误解。iPad 是苹果公司生产的触摸屏设备,基于 iOS 系统,而 Linux 是一个开源操作系统,通常运行在桌面或服务器设备上。如果您是想在 …

ip 查看linux

ip 是一个用于查看和管理网络接口的命令行工具,常用于查看网络接口的状态、配置信息、路由表等。以下是 ip 命令的一些常见用法和示例:一、查看网络接口状态ip a显示所有网络接口的详细信息,包括接口名、IP 地址、子…

从上下文工程到组织知识管理重构——HRBP在人机协同时代的新使命 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:蓝色星球如何打造能与企业共同进化的灵活系统

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第七讲上自监督学习self-supervised learning-BERT

第七讲自监督学习self-supervised learning 常见的自监督模型大小:BERT<GPT<SWITCH 监督学习(supervised learning):有标签 自监督学习(self-supervised learning):没标签(属于无监督学习的一种类型)自…