3 2025 04 23 模拟赛总结

news/2025/10/5 17:41:47/文章来源:https://www.cnblogs.com/michaele/p/19126774

成绩表

![[12 题解/photo/Pasted image 20250423183537.png]]


做题情况

  • T1:看了十分钟没什么思路,后来打表找到了一点规律,但是没写对(可能是因为细节太多)0pts
  • T2:这个题看起来唬人,实际不难,想了大概20分钟,后来写出来了,100pts
  • T3:这题是个三叉线段树,赛时没有想出来,直接打的暴力,25pts
  • T4:赛时没有时间写,0pts

赛时心态

心态比较平稳,T1用时过长,有些慌了神,T3的解法没有遇到过,估计再来点时间我还是会放弃。T4现在看来并不算难题,赛时应该多花点时间去思考,有可能做出来。


题面及题解

T1

传送门

题目描述

定义 \(f(x)=x\oplus (x+2^k)\),其中 \(\oplus\) 是二进制下的异或运算。

给定两个整数 \(n,k\)
请你输出 \(f(0)+f(1)+f(2)+\cdots+f(n)\) 的值。

【数据范围】
对于 \(100\%\) 数据,\(1\le T \leq 10^5\)\(0\le n < 2^{29}\)\(0\le k \leq 29\)


题解

这题的难点在于如何快速求出\(\displaystyle f(x)=x\,\oplus\,(x+2^{k})\)

我们考虑对于每个\(\displaystyle x + 2^{k}\)

  • \(\displaystyle x\)的第\(\displaystyle k\)位为0
    \(x+2^{k}\)相当于把\(x\)的第\(k\)位变成1,此时\(f(x)=2^{k}\)

  • \(x\)的第\(k\)位为1
    \(x+2^{k}\)会导致从第\(k\)位向左发生进位,此时的\(f(x)=2^{l}\)\(l\)为从第\(k\)位开始向左数连续1的个数,就像这样
    ![[12 题解/photo/Pasted image 20250423192448.png]]

所以我们可以去枚举连续1的长度,然后用 可能的情况数\(*\)这种情况的贡献即可求得答案


下面详细说说如何求得每种情况的情况数

设我们固定的1的长度为\(t\),注意:向左一位应该是0,否则不符合条件
首先,对于每个情况(也就是从第\(k\)位开始固定的1的长度),我们需要求出这个条件下\(\leq n\)的最大值\(p\),我们可以先将\(k\sim k+t\)位的一个0和\(t\)个1固定在相应的位置,然后枚举每一位,如果可以放入(不在\(k\sim k+t\)范围内且\(+p\)后的值\(\leq n\)),更新\(p\),这样就能够求出满足条件的最大的\(p\)

我们设p二进制中\(一个0+t个1\)的部分为\(x\),位于其前的部分为\(a\),其后的部分为\(b\),设当前有贡献的数为\(a'+x'+b'\)
而后我们分两种情况统计符合条件的情况

  • \(a'<a\)时,\(a'\)部分的贡献为\(a+1-1\),其中要考虑0和\(=a\)的情况
    \(b'\)则可以取任意数,共有\(k-1+1\)位,其中\(+1\)是因为有第0位,共有\(2^{k}\)种情况
    根据乘法原理,这种情况的贡献为\(a\times 2^{k}\)

  • \(a'=a\)时,\(a'\)部分的贡献为\(1\)\(b'\)部分只能取\(\leq b\)的数,因此\(b'\)部分的贡献为\(b+1\)

两种情况综合起来,再统计到答案即可。


code

using namespace std;
typedef long long ll;int t;
int n, k;int main() {scanf("%d", &t);while(t--) {scanf("%d%d", &n, &k);ll sum = 0;for(int i = 0; i <= 30; i++) {ll p = (1 << i) - 1;p = p << k;if(p > n) continue;for(int j = 30; j >= 0; j--) {if(j >= k && j <= k + i) continue;if(p + (1 << j) <= n) {p += (1 << j);}}int cnt1 = (p >> (k + i + 1)) << k;int cnt2 = p % (1 << k) + 1;sum += (ll)(cnt1 + cnt2) * (((1 << (i + 1)) - 1) << k);}printf("%lld\n", sum);}return 0;
}

T2

传送门

题目描述

在一个无限大的棋盘上有 \(n\)位置互不相同的棋子 \((x_i,y_i)\),你需要通过进行若干次以下操作删除全部的棋子:

  1. 选择一个格子 \((x,y)\)

  2. \((x,y)\) 上有棋子,则把这个棋子删掉,否则结束当前操作。

  3. 依次检查坐标为 \((x+1,y+1)\)\((x+1,y)\)\((x+1,y-1)\) 的格子上是否有棋子。当检查到第一个有棋子的格子时,停止检查,并将当前的 \((x,y)\) 更新为该格子的坐标后返回第二步。如果这三个格子都没有棋子,结束当前操作。

你要回答,最少操作多少次能把所有棋子删光。

【数据范围】
对于所有的测试数据,满足 \(1\le n\le 10^6\)\(1\le x_i,y_i\le 10^6\)


题解

这题较简单,我们画个图即可大概想到怎么做,所以画个图
![[12 题解/photo/Pasted image 20250423201110.png|600]]
对于每个节点,我们都可以走向下方的三个点,所以我们可以从上到下,从左到右枚举每个点,如果有可以到达的点,则将ans--(ans开始=n)

说一下赛后我有些疑惑的一个地方,如下图
![[12 题解/photo/Pasted image 20250423202503.png|500]]
事实上,我们选蓝色路线和红色路线是等价的,答案都是2,所以我们选择哪个点向下走与这个点能够向下走的深度无关。


code

using namespace std;
#define pii pair<int, int>
const int N = 1e6 + 10;int n;
map <pii, int> m;struct node {int a, b;int fa, fb;
}c[N];bool cmp(node x, node y) {if(x.a == y.a) {return x.b < y.b;}return x.a < y.a;
}int main() {scanf("%d", &n);int ans = n;for(int i = 1; i <= n; i++) {int x, y;scanf("%d%d", &x, &y);c[i].a = c[i].fa = x;c[i].b = c[i].fb = y;}sort(c + 1, c + 1 + n, cmp);for(int i = 1; i <= n; i++) {m[{c[i].a, c[i].b}] = i;}for(int i = 1; i <= n; i++) {for(int tt = -1; tt <= 1; tt++) {if(m.count({c[i].a + 1, c[i].b + tt})) {int id = m[{c[i].a + 1, c[i].b + tt}];if(c[id].fa == c[id].a && c[id].fb == c[id].b) {c[id].fa = c[i].a;c[id].fb = c[i].b;
//					printf("fa: %d  fb: %d  sa: %d  sb: %d\n", 
//					c[i].a, c[i].b, c[id].a, c[id].b);ans--;break;}}}}printf("%d\n", ans);return 0;
}

T3

传送门

题目描述

给定一个长度为\(3^{n}\)的由A和B组成的字符串\(s\)
\(q\)次询问,每次询问给定一个\(pos\),如果\(s[pos]==A\)则将\(s[pos]\)改为\(B\),反之亦然
每次询问,我们需要执行以下操作,直至字符串的长度为1

  • \(s[i]\)变为\(s[3i],s[3i-1],s[3i-2]\)中出现次数较多的字符,字符串的长度变为原来的三分之一

输出最后的字符

这个题乍一看没有什么思路,实际上并不难。由题可知,每个变化后的字符都是由三个连续的字符变化而来,并且还有修改操作,所以我们可以用三叉线段树来维护,然后这题就能被我们轻而易举的解决了。


code

const int N = 6e5 + 10;int n, m, cnt = 0;
char c[N];struct node {int dat, s[3];
}t[N << 2];void update(int p) {int ca = 0, cb = 0;for(int i = 0; i < 3; i++) {if(t[t[p].s[i]].dat) ca++;else cb++;}t[p].dat = ca > cb ? 1 : 0;return;
}void build(int &p, int l, int r) {p = ++cnt;if(l == r) {t[p].dat = c[l] == 'A' ? 1 : 0;return;}int mid1 = l + (r - l + 1) / 3 - 1;int mid2 = r - (r - l + 1) / 3;build(t[p].s[0], l, mid1);build(t[p].s[1], mid1 + 1, mid2);build(t[p].s[2], mid2 + 1, r);update(p);
}void modify(int p, int l, int r, int pos) {if(l == r) {t[p].dat = t[p].dat == 1 ? 0 : 1;return;}int mid1 = l + (r - l + 1) / 3 - 1;int mid2 = r - (r - l + 1) / 3;if(pos <= mid1) {modify(t[p].s[0], l, mid1, pos);} else if(pos <= mid2) {modify(t[p].s[1], mid1 + 1, mid2, pos);} else modify(t[p].s[2], mid2 + 1, r, pos);update(p);
} int main() {scanf("%d%d", &n, &m);scanf("%s", c + 1);int root = 0;int tt = pow(3, n);build(root, 1, tt);for(int i = 1; i <= m; i++) {int pos;scanf("%d", &pos);modify(root, 1, tt, pos);printf("%c\n", t[root].dat == 1 ? 'A' : 'B');}return 0;
}

终于到最后一题了,好累…… (T _ T)

T4

传送门

题目描述

给定一个 \(n\)\(m\) 边的无向图,第 \(i\) 条道路连接了 \(u_i\)\(v_i\),边权为 \(w_i\),第 \(i\) 个点的点权为 \(c_i\)

给定 \(q\) 组询问,第 \(i\) 组询问求从 \(s_i\)\(t_i\) 的路径的边权之和与点权的最大值的和的最小值。

可能有重边,但保证无自环。
对于 \(100\%\) 的数据,\(1 \le n \le 250\)\(1 \le m \le 10^4\)\(1 \le q \le 10^4\)


题解

这题比赛的时候没有时间正经想,再加上一大坨英文糊脸,直接放弃了。
做了以后发现并不是很难。

边权和的最小值很容易想到可以用Floyd,但是点权的最大值并不好确定并转移
为了解决这个问题,我们可以先将点按照点权从小到大排序,而后按照此顺序枚举中间点,这样点权的最大值即为\(max(max(c[i].val,c[j].val),c[k].val)\)

这样即可\(O(n^{3})\)预处理答案,通过此题


code

const int N = 255;int n, m, q;
int d[N][N];
int ans[N][N];struct node {int val;int id;
}c[N];bool cmp(node a, node b) {return a.val < b.val;
}int main() {memset(d, 0x3f, sizeof d);memset(ans, 0x3f, sizeof ans);scanf("%d%d%d", &n, &m, &q);for(int i = 1; i <= n; i++) {scanf("%d", &c[i].val);c[i].id = i;}for(int i = 1; i <= m; i++) {int x, y, z;scanf("%d%d%d", &x, &y, &z);d[x][y] = min(d[x][y], z);d[y][x] = min(d[y][x], z);}sort(c + 1, c + 1 + n, cmp);for(int k = 1; k <= n; k++) {for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {d[c[i].id][c[j].id] = min(d[c[i].id][c[j].id], d[c[i].id][c[k].id] + d[c[k].id][c[j].id]);ans[c[i].id][c[j].id] = min(ans[c[i].id][c[j].id],d[c[i].id][c[j].id] + max(max(c[i].val, c[j].val),c[k].val));}}}while(q--) {int x, y;scanf("%d%d", &x, &y);printf("%d\n", ans[x][y]);}return 0;
}

完结撒花(w)

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

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

相关文章

14 收心赛3 T1 最长不降子序列 题解

最长不降子序列 题面 小 W 有一个长度为 \(n\) 的序列 \(a_1, a_2 ...a_n\) ,且 \(a_i\) 的取值都为 1 或 2 现在,你可以任意选择该序列的一个区间进行翻转操作,但你只能翻转一次。 小 W 希望执行操作之后,整个序列…

16 LCA模拟赛1T1 密码 题解

密码 题面 给定两个由字符 \(0 \sim 9\) 组成的字符串 \(s, t\) ,\(t\) 是由 \(s\) 中的一段非空连续子串替换为其各个字符的和得到的 现在要求这一段非空连续子串的左右端点,下标从 1 开始 例如 input: 2148 213 ou…

幼儿做爰网站网站建设前的市场分析

酒吧学DJ打碟他有很多种的说法&#xff0c;有些酒吧他是自己招学生&#xff0c;当这样的酒吧在现今是挺少的&#xff0c;也有&#xff0c;但要求很高。还有一种就是说你自己在酒吧里上班的人自己招私人徒弟什么的&#xff0c;那也是就学DJ打碟&#xff0c;那一搬酒吧都是怎么学…

吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(一)

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

阿里开源规则引擎QLExpress

阿里开源规则引擎QLExpress阿里开源规则引擎QLExpress:彻底告别业务规则硬编码动态脚本解析利器,让业务规则变得灵活可配置在当今快速变化的业务环境中,如何高效灵活地处理频繁变动的业务规则成为了每个开发者面临的…

QOJ7411 Bitwise Xor

内部通道(jzyz P6035),与原题唯一不同在于一个也不选也算一种方案。 首先挖掘性质。将\(a_i\)从小到大排序后,\(a_i\oplus a_j\)的最小值一定在某一对相邻\(a_i\),即\(a_i\oplus a_{i+1}\)处取到。 简易证明:排过…

完整教程:SOC-ESP32S3部分:25-HTTP请求

完整教程:SOC-ESP32S3部分:25-HTTP请求pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

为什么要采用“接口 - 抽象类 - 实现类”这种三层结构? - 浪矢

目录核心思想各层职责与优势第一层:接口 (Interface) - 负责“定义契约”,实现“解耦”第二层:抽象类 (Abstract Class) - 负责“封装通用”,实现“复用”第三层:实现类 (Implementation Class) - 负责“具体业务…

对外提供 AI 服务的风险:合规视角与 AI 安全围栏落地指南

对外提供人工智能服务,主要风险集中在提示词攻击与越权操控、不当内容输出与内容合规、敏感信息与个人信息泄露,以及算法合规、备案与可审计义务。自2023年《生成式人工智能服务管理暂行办法》实施后,企业需要把“数…

遵义市做网站设计公司苏州关键词优化排名推广

本文转载自&#xff1a;http://blog.sina.com.cn/s/blog_9a06890901014ol1.html PHP页面跳转一、header()函数 header函数中Location类型的标头是一种特殊的header调用&#xff0c;常用来实现页面跳转 注意&#xff1a;1、location和“:”号间不能有空格&#xff0c;否则不会跳…

网络安全工具与社区讨论月报

本文记录了r/netsec网络安全社区月度讨论帖,包含成员分享的常用安全工具如Burp Suite和Nuclei,以及社区规则和最新动态,为安全从业者提供实用参考。r/netsec 月度讨论与工具分享帖 社区介绍 /r/netsec 是一个由社区…

机器人运动未来与人机交互研究

本文探讨了机器人运动与人机长期交互的前沿研究,包括机器人意图信号系统、机器学习在机器人感知中的应用,以及大规模实验环境对机器人技术发展的重要性。机器人运动未来与人机交互研究 移动机器人正日益普及:它们在…

欧拉路径 欧拉图 小记

欧拉路径 & 欧拉图 小记 P7771 【模板】欧拉路径 欧拉路径:一个图中经过每条边恰好一次的路径,允许经过重复点。 欧拉回路:起点与终点相同的欧拉路径。 对于连通图,欧拉路径有如下判定:对于无向图,恰好有两个…

OI 笑传 #16

The Taste of Kindness指差す先はインナーワールド 1 ABC423F 终于会了不用二项式反演的做法。 我们把这种东西叫什么好呢?预处理容斥系数? 首先这题是不能一般容斥的,因为我们求解的不是并集,而是独立集。 哎哎独…

课后知识整理

课后知识整理Java方法动手动脑与实验问题全记录 静态导入实验 实验:随机数 Math.random() 局限性 (int)(Math.random()*6) 只能生成 0–5,而不能公平生成 1–6。 Random 带种子实验 实验:

cf296b

CF296B Yaroslav and Two Strings link 题意 给定两个由数字和 ? 组成的字符串 \(s,t\),将 ? 替换为数字。若 \(s,t\) 中有 \(s_i>w_i,s_j<w_j(1\leq i,j\leq n)\),则是一种合法的替换。求合法的方案数对 \(…

昆山做网站费用个人工作室怎么注册

这个教程会教您如何设计发光斑驳的字体特效&#xff0c;会教您运用PS滤镜和纹理图片&#xff0c;同时也诠释了如何运用笔刷和图层样式给最终的字体效果增添光感。来&#xff0c;先看看最终效果&#xff01;第一步&#xff1a;创建一个1024*768的新文档。前景色#532118&#xff…

云原生与DevOps融合实践:加速企业数字化转型的加速器 - 详解

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

第一次使用Ttpora

MarkDown使用教学 两个井号创建二级标题 一个井号创建一级标题就是最上边的那个 字体 两边都加星号,字体就变成黑色了 两边都加星号,字体就变成黑色了 两边都加两个星号,字体就变成黑色了 两边加一个型号,变成斜体…

Apache反向代理

“apache2 网站静态文件” = /var/www/html/ Apache 本身就可以作为一个反向代理服务器来使用,通常是通过 mod_proxy 及其附加模块来实现。 下面是启用 Apache 反向代理的基本步骤: 1. 启用必要的模块 你需要启用以下…