[赛记] 冲刺CSP联训模拟1[衡中]

news/2024/10/5 12:00:06

几何 100pts

赛时打的 $ DP $ 没有用 bitset 优化过了,也是放过了暴力

考虑设状态 $ f_{i, j, k} $ 表示考虑到第 $ i $ 位,到第 $ j $ 位 $ x $ 和第 $ k $ 位 $ y $ 可不可取,直接转移即可;

时间复杂度:$ \Theta(|s||x||y|) $,应该是过不了的;

点击查看暴力
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t;
char s[500005], x[55], y[55];
int sl, xl, yl;
bool f[2][52][52];
int main() {freopen("geometry.in", "r", stdin);freopen("geometry.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> t;while(t--) {cin >> (s + 1);cin >> (x + 1);cin >> (y + 1);memset(f, false, sizeof(f));sl = strlen(s + 1);xl = strlen(x + 1);yl = strlen(y + 1);f[0][xl][0] = true;f[0][0][yl] = true;for (int i = 1; i <= sl; i++) {memset(f[i & 1], false, sizeof(f[i & 1]));for (int j = 0; j <= xl; j++) {for (int k = 0; k <= yl; k++) {if (s[i] == x[j]) {if (j - 1 == 0) {f[i & 1][j][k] |= f[(i - 1) & 1][xl][k];f[i & 1][j][k] |= f[(i - 1) & 1][0][k];} else {f[i & 1][j][k] |= f[(i - 1) & 1][j - 1][k];}}if (s[i] == y[k]) {if (k - 1 == 0) {f[i & 1][j][k] |= f[(i - 1) & 1][j][0];f[i & 1][j][k] |= f[(i - 1) & 1][j][yl];} else {f[i & 1][j][k] |= f[(i - 1) & 1][j][k - 1];}}}}}if (f[sl & 1][xl][yl] || f[sl & 1][xl][0] || f[sl & 1][0][yl]) {cout << "Yes" << '\n';} else {cout << "No" << '\n';}}return 0;
}

根据我们以前的经验,我们可以将答案与状态后两维中的一位互换,所以设 $ f_{i, j} = k $ 表示考虑前 $ i $ 位,到第 $ j $ 位 $ x $ 时所有合法的 $ y $ 的状态,这时我们就可以用 bitset 来存储 $ f $ 数组,进而转移;

转移其实就是循环移位和按位与和按位或的操作;

时间复杂度:$ \Theta(\frac{|s||x||y|}{w}) $;

点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset>
using namespace std;
int t;
char s[500005], x[55], y[55];
int sl, xl, yl;
bitset<55> f[2][52];
bitset<55> g[500005];
bitset<55> Y(bitset<55> x) {int y = x[yl];bitset<55> bit = (x << 1);if (y) bit[1] = 1;return bit;
}
int main() {freopen("geometry.in", "r", stdin);freopen("geometry.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> t;while(t--) {cin >> (s + 1);cin >> (x + 1);cin >> (y + 1);memset(f, 0, sizeof(f));memset(g, 0, sizeof(g));sl = strlen(s + 1);xl = strlen(x + 1);yl = strlen(y + 1);for (int i = 1; i <= sl; i++) {for (int j = 1; j <= yl; j++) {if (s[i] == y[j]) g[i][j] = 1;}}f[0][0][0] = 1;for (int i = 1; i <= sl; i++) {memset(f[i & 1], 0, sizeof(f[i & 1]));for (int j = 0; j <= xl; j++) {if (s[i] == x[j]) {f[i & 1][j] |= f[(i - 1) & 1][j - 1];if (j - 1 == 0) f[i & 1][j] |= f[(i - 1) & 1][xl];}bitset<55> b = Y(f[(i - 1) & 1][j]);b &= g[i];f[i & 1][j] |= b;}}if (f[sl & 1][xl][yl] || f[sl & 1][xl][0] || f[sl & 1][0][yl]) {cout << "Yes" << '\n';} else {cout << "No" << '\n';}}return 0;
}

分析 0pts

$ DP $,。。。

点击查看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
long long a, b;
long long f[500005][2][2], w[2][2];
struct sss{int t, ne;
}e[2000005];
int h[2000005], cnt;
void add(int u, int v) {e[++cnt].t = v;e[cnt].ne = h[u];h[u] = cnt;
}
void dfs(int x, int fa) {f[x][0][0] = 0;for (int i = h[x]; i; i = e[i].ne) {int u = e[i].t;if (u == fa) continue;dfs(u, x);for (int j = 0; j <= 1; j++) {for (int k = 0; k <= 1; k++) {w[j][k] = f[x][j][k];f[x][j][k] = 0x3f3f3f3f3f3f3f3f;}}for (int j = 0; j <= 1; j++) {for (int k = 0; k <= 1; k++) {for (int uj = 0; uj <= 1; uj++) {for (int uk = 0; uk <= 1; uk++) {f[x][j][k | uj | uk] = min(f[x][j][k | uj | uk], w[j][k] + f[u][uj][uk] + a);long long now = 0;if (j && uj) {now = -b;} else if (!j && !uj) {now = b;}f[x][j ^ 1][k | (uj ^ 1) | uk] = min(f[x][j ^ 1][k | (uj ^ 1) | uk], w[j][k] + f[u][uj][uk] + now);}}}}}
}
int main() {freopen("analyse.in", "r", stdin);freopen("analyse.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;cin >> a >> b;a = min(a, b);int x, y;for (int i = 1; i <= n - 1; i++) {cin >> x >> y;add(x, y);add(y, x);}memset(f, 0x3f, sizeof(f));dfs(1, 0);cout << min({f[1][0][0], f[1][0][1] - b, f[1][1][0] - b, f[1][1][1] - b});return 0;
}

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

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

相关文章

c盘清理指南

1.清理缓存文件 快捷键Win+R输入%temp%2.磁盘清理直接win键+搜索磁盘清理3.休眠文件关闭关机时下次开机powercfg -h off 有需要休眠文件的时候再powercfg -h on 4.临时文件 设置→系统→存储→临时文件,删除! 5.把ubuntu从c移到d出现0x80073cf6错误代码 https://www.yundongf…

轻松找到并查看织梦CMS的数据库配置文件,从而获取数据库连接信息

使用FTP工具连接到服务器。 导航到 /var/www/html/include 目录。 打开 config.inc.php 文件。使用SSH连接到服务器。 切换到相应目录:bashcd /var/www/html/include使用文本编辑器打开文件:bashvi config.inc.php通过以上步骤,你可以轻松找到并查看织梦CMS的数据库配置文件…

Leetcode 1631. 最小体力消耗路径

1.题目基本信息 1.1.题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你…

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase、V…

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。