[赛记] 冲刺CSP联训模拟2

news/2024/10/5 15:06:36/文章来源:https://www.cnblogs.com/PeppaEvenPig/p/18447856

三道计数 + 一道数据结构也是没谁了

这场可是好好锻炼了我的写暴搜能力。。。

挤压 20pts

暴搜20pts;

把最后的答案进行二进制拆解,即 $ ans = 2^i + 2^j + 2^k + ... $,那么答案的平方为 $ \sum_{i = 0}^{30} \sum_{j = 0}^{30} s_i s_j 2^{i + j} $,其中 $ s_i, s_j $ 代表答案二进制拆解后这一位是 $ 1 $ 还是 $ 0 $;

那么我们发现,答案的平方只和答案二进制拆解后的任意两位有关,所以我们直接设 $ f_{k, i, j, 0/1, 0/1} $ 表示考虑到第 $ k $ 个数字,第 $ i $ 位是 $ 0/1 $,第 $ j $ 位是 $ 0/1 $ 的概率即可;

这其实是个概率 $ DP $,从第一步开始其实比较难想

点击查看代码
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const long long mod = 1e9 + 7;
long long n;
long long a[500005], q[500005];
long long ksm(long long a, long long b) {long long ans = 1;while(b) {if (b & 1) ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;
}
long long f[35][35][2][2], now[2][2];
int main() {freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;long long kk = ksm(1000000000, mod - 2);for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) {cin >> q[i];q[i] = q[i] * kk % mod;}for (int i = 0; i <= 30; i++) {for (int j = 0; j <= 30; j++) {f[i][j][0][0] = 1;}}for (int i = 1; i <= n; i++) {for (int j = 0; j <= 30; j++) {for (int k = 0; k <= 30; k++) {for (int l = 0; l <= 1; l++) {for (int r = 0; r <= 1; r++) {now[l][r] = f[j][k][l][r];}}bool tj = false;bool tk = false;if ((a[i] >> j) & 1) tj = true;if ((a[i] >> k) & 1) tk = true;for (int l = 0; l <= 1; l++) {for (int r = 0; r <= 1; r++) {f[j][k][l][r] = (now[l][r] * (1 - q[i] + mod) % mod + now[l ^ tj][r ^ tk] * q[i] % mod) % mod;}}}}}long long ans = 0;for (int i = 0; i <= 30; i++) {for (int j = 0; j <= 30; j++) {ans = (ans + f[i][j][1][1] * ksm(2, i + j) % mod) % mod;}}cout << ans;return 0;
}

工地难题 30pts

暴搜30pts

考虑正解,是个容斥,题解详见[算法] 容斥的例题;

星空遗迹 20pts

$ \Theta(n^3) $ 暴力20pts;

考虑正解,发现可以单调栈维护,满足下面的能够赢上面的,答案就是栈大小最小时对应的元素,于是可以线段树区间修改区间查最小;

时间复杂度:$ \Theta(n \log n) $;

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
int n, q;
char s[500005];
char win(char x, char y) {if (x == y) return x;if ((x == 'R' && y == 'S') || (x == 'S' && y == 'R')) return 'R';if ((x == 'S' && y == 'P') || (x == 'P' && y == 'S')) return 'S';if ((x == 'P' && y == 'R') || (x == 'R' && y == 'P')) return 'P';
}
int f[500005];
namespace SEG{inline int ls(int x) {return x << 1;}inline int rs(int x) {return x << 1 | 1;}struct sss{int l, r, lz;pair<int, int> mi;}tr[3000005];inline void push_up(int id) {tr[id].mi = min(tr[ls(id)].mi, tr[rs(id)].mi);}inline void push_down(int id) {if (tr[id].lz) {tr[ls(id)].lz += tr[id].lz;tr[rs(id)].lz += tr[id].lz;tr[ls(id)].mi.first += tr[id].lz;tr[rs(id)].mi.first += tr[id].lz;tr[id].lz = 0;}}void bt(int id, int l, int r) {tr[id].l = l;tr[id].r = r;if (l == r) {tr[id].mi = {f[l], l};return;}int mid = (l + r) >> 1;bt(ls(id), l, mid);bt(rs(id), mid + 1, r);push_up(id);}void add(int id, int l, int r, int d) {if (tr[id].l >= l && tr[id].r <= r) {tr[id].mi.first += d;tr[id].lz += d;return;}push_down(id);int mid = (tr[id].l + tr[id].r) >> 1;if (l <= mid) add(ls(id), l, r, d);if (r > mid) add(rs(id), l, r, d);push_up(id);}pair<int, int> ask(int id, int l, int r) {if (tr[id].l >= l && tr[id].r <= r) {return tr[id].mi;}push_down(id);int mid = (tr[id].l + tr[id].r) >> 1;if (r <= mid) return ask(ls(id), l, r);else if (l > mid) return ask(rs(id), l, r);else return min(ask(ls(id), l, mid), ask(rs(id), mid + 1, r));}
}
using namespace SEG;
int main() {freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> q;for (int i = 1; i <= n; i++) {cin >> s[i];}f[1] = 1;for (int i = 2; i <= n; i++) {if (s[i] == s[i - 1]) {f[i] = f[i - 1];continue;}if (win(s[i], s[i - 1]) == s[i]) {f[i] = f[i - 1] - 1;continue;}if (win(s[i], s[i - 1]) == s[i - 1]) {f[i] = f[i - 1] + 1;continue;}}bt(1, 1, n);int ss, l, r;char y;for (int i = 1; i <= q; i++) {cin >> ss >> l;if (ss == 1) {cin >> y;if (y == s[l]) continue;if (l > 1) {int ls = 0;if (s[l - 1] == s[l]) ls = 0;else if (win(s[l - 1], s[l]) == s[l - 1]) ls = 1;else if (win(s[l - 1], s[l]) == s[l]) ls = -1;int now = 0;if (s[l - 1] == y) now = 0;else if (win(s[l - 1], y) == s[l - 1]) now = 1;else if (win(s[l - 1], y) == y) now = -1;add(1, l, n, now - ls);}if (l < n) {int ls = 0;if (s[l + 1] == s[l]) ls = 0;else if (win(s[l], s[l + 1]) == s[l]) ls = 1;else if (win(s[l], s[l + 1]) == s[l + 1]) ls = -1;int now = 0;if (y == s[l + 1]) now = 0;else if (win(s[l + 1], y) == y) now = 1;else if (win(s[l + 1], y) == s[l + 1]) now = -1;add(1, l + 1, n, now - ls); }s[l] = y;}if (ss == 2) {cin >> r;cout << s[ask(1, l, r).second] << '\n';}}return 0;
}

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

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

相关文章

WMS、WCS、WES:它们是什么以及有何不同

WMS、WCS和WES是仓库管理系统中的三个重要组成部分。 WMS关注库存流和存储,优化劳动力管理和资源利用; WCS负责执行WMS创建的计划和活动序列,提供设备和系统的实时监控; WES则充当WMS和WCS之间的桥梁,提高运营效率、灵活性和可扩展性。 这三个系统相互协作,共同提升仓库绩…

高级语言程序设计第二次个人作业.

这个作业属于哪个课程: https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/1328 学号:102400107 姓名:陶玉兰这次作业过程中有以下几个问题: 1.在例3.7输出时以惯用的cpp格式直接输出了,没有注意到要求…

统计术语

基期、现期 作为对比参照的时期称为基期,而相对于基期的称为现期。 例,今年比去年公司营收增加100万。 去年:基期 今年:现期增长量 增长量是指基期量与现期量增长(或减少)的绝对量。 表述特征: ……比……增长(下降)某个具体值。 增长量=现期量-基期量;增长率 是指增长量与…

MAC 安装 Homebrew (使用国内镜像源)

Homebrew 官方地址 https://brew.sh/zh-cn/ 官方地址使用github的源,国内访问速度很慢,所以我们需要使用国内的源。 自动安装 Homebrew 首先可以尝试自动安装方法,直接一行命令就行: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homeb…

GraphQL、sequelize-typescript 、Apollo Server 4 实例

新建项目文件夹$ mkdir demo $ cd demo初始化TypeScript配置$ npx tsc --init安装 Sequelize Sequelize-cli$ npm install --save-dev @types/node @types/validator $ npm install sequelize reflect-metadata sequelize-typescript $ npm install --save-dev ts-node @types/…

@ImportResource用法

用法 @ImportResource 注解用于导入 Spring的配置文件,让某个配置文件中的bean生效; SpringBoot里没有 Spring的配置文件,自己可以手动编写配置文件,但Spring Boot不能自动识别,此时需要在配置类中引入编写的配置文件 注意:这个配置文件生效需要放在 配置类上!! 举个例…

ROS基础入门——实操教程3C

合集 - Ubuntu强化学习合集(3)1.命令行gcc -v和g++ -v输出版本不一致09-272.crypt.h:No such file or directory 报错处理09-283.ROS基础入门——实操教程10-04收起 ROS基础入门——实操教程前言 本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过…

Linux_权限理解(详细PLUS)Gu

1.用户 Linux下有两种用户:超级用户(root)和普通用户; 超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情 超级用户的命令提示符是"#",普通用户的命令提示符是"$"超级用户:普通用户:2.用户切换 用户间切换: su + 用…

织梦php数据库配置文件

织梦CMS(DedeCMS)的数据库配置文件通常位于安装目录下的 include 文件夹中,具体文件名为 config.inc.php。这个文件包含了数据库连接的所有必要信息。下面详细说明如何配置这个文件。 步骤 1: 备份现有配置文件 在修改任何配置文件之前,最好先备份现有的配置文件,以防万一…

连接到数据库,你可以查看织梦CMS的相关表结构和数据

一旦连接到数据库,你可以查看织梦CMS的相关表结构和数据。 使用phpMyAdmin查看数据库表在phpMyAdmin中,选择你的织梦CMS数据库。 点击左侧的数据库名称,可以看到所有的表列表。 点击每个表,可以查看表结构和数据。使用MySQL命令行查看数据库表进入数据库后,运行以下命令查…