0%

题目大意

P16231 [蓝桥杯 2026 省 A] 基因研究

题目描述

DNA 分子的四种碱基分别记为 A、T、G、C。每个人的基因序列都可以认为是一个由 A、T、G、C 四种字符组成的长度为 nn 的字符串。

小蓝正在研究一种疾病。他观察到,这种疾病存在一个固定的易感序列(也可认为是一个由 A、T、G、C 构成的字符串)。若某人的基因序列中存在一个子串恰好等于这个易感序列,则称此人“易感”;若基因序列的任意子串都不等于这个易感序列,则称此人“不易感”。

小蓝希望根据这座城市中人们的基因序列情况,估计出城里“易感”人群所占的比例。

然而,直接获取整座城市中每个人完整的基因序列非常困难。为此,小蓝采用了抽样统计的方法:通过大量采样,他估计出了在这座城市中,每一个位置上碱基为 A、T、G、C 的人数占比。我们可以将其理解为:在所有人的基因序列中,第 ii 个位置为 A、T、G、C 的人数占比分别是多少。

为了简化模型,小蓝作出如下假设:对于任意一个人,其基因序列在每个位置上的碱基分布与采样结果完全一致,且不同位置之间的碱基相互独立。也就是说,即使已经确定了若干个位置上的碱基,剩余位置上的碱基仍然按照对应位置的分布独立生成。

现在,小蓝决定将这些概率以模 998244353998244353 的形式算出:如果“易感”人群所占比例为 pq\frac{p}{q},则小蓝希望得到一个整数 xx,满足 x×qp(mod998244353)x \times q \equiv p \pmod{998244353}。请你根据给定的易感序列,以及每个位置上四种碱基的概率分布,帮小蓝计算并输出这个整数 xx

输入格式

第一行包含两个正整数 n,mn, m,分别表示基因序列长度和易感序列长度。

第二行包含一个长度为 mm 的字符串 ss,仅由 A、T、G、C 构成,表示疾病对应的易感序列。

接下来 nn 行,每行包含四个非负整数 ai,ti,gi,cia_i, t_i, g_i, c_i。其中:

  • aia_i 表示第 ii 个位置碱基为 A 的概率(模 998244353998244353 意义下);

  • tit_i 表示第 ii 个位置碱基为 T 的概率(模 998244353998244353 意义下);

  • gig_i 表示第 ii 个位置碱基为 G 的概率(模 998244353998244353 意义下);

  • cic_i 表示第 ii 个位置碱基为 C 的概率(模 998244353998244353 意义下)。

保证对任意 ii,均有 (ai+ti+gi+ci)mod998244353=1(a_i + t_i + g_i + c_i) \bmod 998244353 = 1

输出格式

输出一行,包含一个非负整数,表示“基因序列中包含易感序列作为子串”的人群占比在模 998244353998244353 意义下的结果。

输入输出样例 #1

输入 #1

1
2
3
4
5
3 2
AA
499122177 499122177 0 0
499122177 0 499122177 0
499122177 0 0 499122177

输出 #1

1
623902721

说明/提示

【样例说明】

基因序列共有 33 个位置:

  • 11 位有 12\frac{1}{2} 的概率是 AA,有 12\frac{1}{2} 的概率是 TT

  • 22 位有 12\frac{1}{2} 的概率是 AA,有 12\frac{1}{2} 的概率是 GG

  • 33 位有 12\frac{1}{2} 的概率是 AA,有 12\frac{1}{2} 的概率是 CC

易感序列为 AAAA。因此,一个人被视为“易感”,当且仅当其基因序列中包含子串 AAAA

所有可能产生的基因序列中,满足条件的共有 3 种,分别是 AACAACTAATAAAAAAAA。这 3 种序列出现的概率均为 18\frac{1}{8},因此“易感”人群所占的总比例为 18+18+18=38\frac{1}{8} + \frac{1}{8} + \frac{1}{8} = \frac{3}{8},其在模 998244353998244353 意义下的结果为 623902721623902721

【评测用例规模与约定】

对于 30%30\% 的数据,1mn51 \le m \le n \le 5

另存在 20%20\% 的数据,ai=ti=gi=cia_i = t_i = g_i = c_i

对于 100%100\% 的数据,1mn3000,0ai,ti,gi,ci<9982443531 \le m \le n \le 3000, 0 \le a_i, t_i, g_i, c_i < 998244353

思路讲解

AC代码

心路历程(WA,TLE,MLE……)

题目大意

P16230 [蓝桥杯 2026 省 A] 综合应变指标

题目描述

航空引擎涡轮叶片是确保国家空天安全的核心装备,其制造工艺代表了工业技术的巅峰。

这天,在精密检测实验室的中央,首席结构分析师小蓝正利用高精度传感器,沿涡轮叶片的中轴线进行连续扫描。扫描产生的反馈数据被转化为一条包含 NN 个元素的序列 A=(A1,A2,,AN)A = (A_1, A_2, \dots, A_N)

为了评估叶片在极限运行负载下的稳定性,小蓝需要针对这组序列计算出一个综合应变指标。计算该指标的第一步是选定三个分割点 i,j,ki, j, k(满足 1i<j<k<N1 \le i < j < k < N),将整条序列划分为以下四个连续且非空的子段:

  1. 第一段:A1,,AiA_1, \dots, A_i

  2. 第二段:Ai+1,,AjA_{i+1}, \dots, A_j

  3. 第三段:Aj+1,,AkA_{j+1}, \dots, A_k

  4. 第四段:Ak+1,,ANA_{k+1}, \dots, A_N

第二步,需要计算每一个子段内所有数值的总和,并取其绝对值。这四个绝对值的累加总和被定义为该划分方案下的综合应变指标:

A1++Ai+Ai+1++Aj+Aj+1++Ak+Ak+1++AN |A_1 + \cdots + A_i| + |A_{i+1} + \cdots + A_j| + |A_{j+1} + \cdots + A_k| + |A_{k+1} + \cdots + A_N|

分割点的选择有多种可能,不同的方案会导致不同的指标结果。

现在,请你帮助小蓝找出一种划分方案,使得得到的综合应变指标的数值最大。

输入格式

第一行包含一个正整数 NN,表示扫描序列采集到的反馈节点总数。

第二行包含 NN 个整数 A1,A2,,ANA_1, A_2, \dots, A_N,表示序列的元素。

输出格式

输出一行一个整数,表示序列所能达到的最大综合应变指标。

输入输出样例 #1

输入 #1

1
2
5
1 -1 -2 3 5

输出 #1

1
12

说明/提示

【评测用例规模与约定】

对于 30%30\% 的评测用例,4N1004 \le N \le 100

对于 60%60\% 的评测用例,4N4004 \le N \le 400

对于所有评测用例,4N1054 \le N \le 10^5109Ai109-10^9 \le A_i \le 10^9

思路讲解

PDF

image

写出一个 O(n2)O(n^2) 的 dp 代码没有那么难。

1
2
3
4
5
6
7
void excute_dp(const vector<ll> &dp1, vector<ll> &dp2) {
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= i; ++j) {
dp2[i] = max(dp2[i], dp1[j] + abs(preA[i] - preA[j]));
}
}
}

现在最关键的就是如何把这个内层的 for 循环给优化掉。

有绝对值?那就要把绝对值去掉,用分类讨论。

说白了,其实就是这样子,因为我们有 max 函数,甚至可以不需要分类讨论。

1
2
3
4
5
6
7
8
void excute_dp(const vector<ll> &dp1, vector<ll> &dp2) {
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= i; ++j) {
dp2[i] = max(dp2[i], dp1[j] + preA[i] - preA[j]);
dp2[i] = max(dp2[i], dp1[j] - (preA[i] - preA[j]));
}
}
}

AC代码

AC
https://www.luogu.com.cn/record/273684075

心路历程(WA,TLE,MLE……)

题目大意

P16229 [蓝桥杯 2026 省 A] 外卖配送

题目描述

午高峰的外卖站点里,骑手小蓝正紧盯着屏幕上待处理的 NN 个订单。这些订单必须严格按照系统列表中的固定顺序依次配送,不可打乱或跳过。为了顺利完成任务,小蓝计划将这 NN 个订单分成若干个批次进行配送。

站点内停放着 MM 种不同的交通工具,每种工具都具备两个属性:平均路途耗时 AiA_i 和箱体拥挤系数 BiB_i。对于每一个批次,小蓝可以根据该批次订单的数量,从 MM 种工具中独立选择一种最合适的。

假设某一个批次包含 LL 个订单,且小蓝选用第 ii 种交通工具,则该批次的总耗时由以下三部分组成:

  1. 路途耗时:L×AiL \times A_i 秒。

  2. 取餐耗时:由于箱内挤压,整理 LL 个订单需处理 L(L1)2\frac{L(L-1)}{2} 对挤压关系,每对耗时 BiB_i,共计 L(L1)2×Bi\frac{L(L-1)}{2} \times B_i 秒。

  3. 折返耗时:分批配送存在额外的折返成本。处理第一个批次时,由于小蓝默认已在站点装车完毕可以直接出发,此项耗时为 00 秒;但从第二个批次开始,每开启一个新的批次,都必须花费固定的 XX 秒用于返回站点装载下一批订单。

现在,请你帮助小蓝规划最优的分批方案,并计算出送完 NN 个订单所需的最小总耗时。

输入格式

一行包含三个整数 NNMMXX,分别表示订单总数、交通工具的种类数,以及固定耗时。

接下来的 MM 行,每行包含两个整数 AiA_iBiB_i,依次表示第 ii 种交通工具的平均路途耗时与箱体拥挤系数。

输出格式

输出一个整数,表示完成全部 NN 个订单配送任务所需的最小总耗时(单位:秒)。

输入输出样例 #1

输入 #1

1
2
3
5 2 40
10 8
2 20

输出 #1

1
118

说明/提示

【样例说明】

一种最优的方案是分成 22 批配送:

阶段 详情 耗时
11 批(22 单,选工具 22 路途 2×2=42 \times 2 = 4;取餐 2×12×20=20\frac{2 \times 1}{2} \times 20 = 20 2424
折返 固定耗时 4040
22 批(33 单,选工具 11 路途 3×10=303 \times 10 = 30;取餐 3×22×8=24\frac{3 \times 2}{2} \times 8 = 24 5454
合计 < 118\mathbf{118}

【评测用例规模与约定】

对于 30%30\% 的评测用例,1N,M1001 \le N, M \le 100

对于所有评测用例,1N,M50001 \le N, M \le 50001X,Ai,Bi1091 \le X, A_i, B_i \le 10^9

思路讲解

PDF

其实我觉得 AI 说的不好,不过为了方便索引还是贴过来了

其实就是一个完全背包问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Solve() {
cin >> N >> M >> X;
abls.resize(M);
for (int i = 0; i < M; ++i) {
cin >> abls[i][0] >> abls[i][1];
}
dp.resize(N + 2, INF);
for (int L = 1; L <= N; ++L) {
for (int i = 0; i < M; ++i) {
auto [a,b] = abls[i];
dp[L] = min(dp[L], a * L + ((L * (L - 1)) / 2) * b);
}
}
dpN.resize(N + 2, INF);
dpN[0] = 0;
for (int L = 1; L <= N; ++L) {
for (int w = L; w <= N; ++w) {
if (w - L < 0) {
continue;
}
if (dp[L] + dpN[w - L] + X < dpN[w]) {
dpN[w] = dp[L] + dpN[w - L] + X;
}
}
}
cout << dpN[N] - X << "\n";
}

AC代码

AC
https://www.luogu.com.cn/record/273605286

心路历程(WA,TLE,MLE……)

题目大意

P16228 [蓝桥杯 2026 省 A] 读取指令

题目描述

你正在管理一个老旧的线性机械硬盘,该硬盘被划分为 NN 个连续的扇区(编号从 11NN)。

由于文件系统的特殊分配机制,第 ii 个扇区中存储的数据量为 C×iC \times i 字节(其中 CC 是系统簇大小的常数)。例如,当 C=2C = 2 时,第 1144 个扇区的数据量分别为 2,4,6,82, 4, 6, 8 字节。

现在,你需要从这块硬盘中恰好读取 WW 字节的数据来进行恢复。为了最小化磁头的寻道损耗,你只能向硬盘发送“读取指令”。每次指令可以指定一个连续的扇区区间 [l,r][l, r],并读取该区间内的所有数据。

请问,要读取恰好 WW 字节的数据,最少需要发送多少次读取指令?注意:每个扇区最多只能被读取一次。如果无论如何也无法凑出恰好 WW 字节,请输出 1-1

输入格式

第一行包含一个整数 TT,表示测试用例的组数。

接下来 TT 行,每行包含三个整数 N,C,WN, C, W,相邻整数之间用空格隔开。

输出格式

对于每组测试用例,输出一行一个整数,表示最少的读取指令次数。如果无法完成,输出 1-1

输入输出样例 #1

输入 #1

1
2
3
4
3
4 2 10
4 2 16
4 2 7

输出 #1

1
2
3
1
2
-1

说明/提示

【评测用例规模与约定】

对于 30%30\% 的评测用例,1N10001 \le N \le 1000T=2T = 2

对于所有的评测用例,1N1051 \le N \le 10^52T102 \le T \le 101C1001 \le C \le 1000W1090 \le W \le 10^9

思路讲解

PDF

其实在考场上,我通过打表,有点猜出来了这个答案只可能是 -1,0,1,2 ,当然,我肯定也不是那么自信,而且,我也傻了,既然答案只能在这里面取,排除了 1,答案就只可能是 2 了(当然其他特殊情况前面早就搞定了)。

image

image

AC代码

AC
https://www.luogu.com.cn/record/273572038

心路历程(WA,TLE,MLE……)

题目大意

P16224 [蓝桥杯 2026 省 A] 均衡数

题目描述

如果一个正整数的二进制表示中(无前导 00),11 的数量和 00 的数量相同,则我们称其为一个“均衡数”。

现在,请你找到一个均衡数 xx,使得 2026202620262026x|2026202620262026 - x| 的值最小。若存在多个均衡数使得 2026202620262026x|2026202620262026 - x| 的值相同且最小,则取其中最小的一个。

输入格式

输出格式

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

输入输出样例 #1

输入 #1

1

输出 #1

1

思路讲解

说白了,最靠近的就是 50 位最大均衡数52 位最小均衡数

这个是 52 位最小均衡数,比这个 50 位的最大的更接近,故选这个。

1
2
3
>>> bin(2251799847239679)
'0b1000000000000000000000000001111111111111111111111111'
>>>

AC代码

AC
https://www.luogu.com.cn/record/273571661

心路历程(WA,TLE,MLE……)