
赛中
8.30am 开始比赛
9.00am 看了第一题,没想到正解,打完第一题的暴力
9.00am ~ 10.00am 看第二题,想到单调栈做法,飞快写完
10.00am~11.00am 看第三和第四题,先把第4题的 暴力写了,想第三题
11.00am~12.00am 想第三题,想到正解的迪杰斯特拉做法
12.00am 结束比赛
赛中比分
emm,有点炸了
共40分。。。

题解
第一题
1. 01串
题目ID:22808必做题文件操作100分
最新提交:
时间限制: 1000ms
空间限制: 1048576kB
输入文件名: string.in
输出文件名: string.out
题目描述
给定一个01串(即只有’0’和’1’的字符串)。问有多少个子串满足0的数量是1的数量的平方?
输入格式
一行一个01串。
输出格式
输出一行答案。
样例
Input 1
010001
Output 1
4
样例解释
分别是(1,2),(1,6),(2,3),(5,6)
数据范围
对于60%的数据,字符串长度不超过1000
对于100%的数据,字符串长度不超过300000
代码解释
- 前缀和数组:
pre0[i]和pre1[i]分别存储前i个字符中0和1的累计数量。 - 哈希表统计:使用
defaultdict来记录每个val = pre0[j] - pre1[j]²的出现次数。初始时,val=0出现一次,对应空子串的情况。 - 遍历计算:对于每个位置
j,计算当前val并查询哈希表中该值的出现次数,累加到结果res中。然后将当前val的出现次数加1,更新哈希表。 - 输出结果:最终结果
res即为所有满足条件的子串数量。
这种方法通过数学转换和哈希表优化,将时间复杂度从 O(n²) 降低到 O(n),适用于大规模数据输入。
第二题
2. 风神之诗
题目ID:4639必做题100分
时间限制: 2000ms
空间限制: 524288kB
题目描述

输入格式

unsigned sd ; int rd (){ return ( sd^=sd <<13,sd^=sd >>17,sd^=sd<<5)%n+1;}

输出格式

样例
Input 1
10 6 402338762 9 1 15 24 19 42 26 42 88 54
Output 1
43
样例解释

数据范围

题解
这题是我喜欢(taoyan)的单调栈,主要思路是维护单调栈数组单调递增,然后再通过前缀和的方式优化单调栈的过程
注意:这里要维护下标而不是大小
第三题
3. 涛涛的避险策略
题目ID:19548必做题100分
最新提交:
20 分
时间限制: 2000ms
空间限制: 262144kB
题目背景
涛涛现在在名为 Asterisk 的异世界中,这里的一切都和星星有关。
题目描述
简单来说,Asterisk世界有 NN 个城市,编号为 1 的首都是重要的枢纽。每个城市蕴藏着不同价值的星能晶体。连接这些城市之间存在 MM 条通道,每条通道都有其能量不稳定性,以一个“断裂指数”来衡量。
为了确保首都与其他城市的稳定联络,并考虑到潜在的通道断裂风险,涛涛需要规划一张坚固的通道网络。这张网络必须能够连通所有城市(形成一棵树)。
对于涛涛选定的树中的每一条通道,一旦该通道断裂,将会导致一些城市与首都失去直接或间接的连接。这些失联的城市所蕴藏的星能晶体将无法输送至首都,造成能量损失。损失的大小等于所有失联城市的星能晶体价值之和。
涛涛希望选择一棵树,使得在该树中,每条通道断裂后造成的能量损失与该通道的断裂指数的乘积的总和 达到最小。
请你帮助涛涛在 Asterisk 世界中制定这个最优的避险策略,计算出这个最小的总和。
输入格式
第一行两个整数N,MN,M
第二行NN个整数,表示每个星之据点的星能晶体数量pipi
接下来MM行,每行3个整数x,y,wx,y,w,表示一条连结x,yx,y的断裂指数为ww的通道
输出格式
一行一个整数,表示所求的最小的和
样例
Input 1
5 7 10 5 8 3 7 1 2 2 1 4 1 1 5 4 2 3 2 2 5 1 3 5 3 4 5 1
Output 1
59
样例解释
选择通道[1,2,2],[1,4,1],[2,3,2],[4,5,1]
如果删除通道[1,2,2],能量损失为13,乘积为26
如果删除通道[1,4,1],能量损失为10,乘积为10
如果删除通道[2,3,2],能量损失为8,乘积为16
如果删除通道[4,5,1],能量损失为7,乘积为7
总和为59
数据范围
| 数据 | n | m | pi | wi |
|---|---|---|---|---|
| 1-5 | ≤10≤10 | ≤10≤10 | ≤10≤10 | ≤10≤10 |
| 6-10 | ≤200≤200 | ≤1000≤1000 | ≤50≤50 | ≤1000≤1000 |
| 11-20 | ≤5000≤5000 | ≤2∗104≤2∗104 | ≤200≤200 | ≤20000≤20000 |
| 21-25 | ≤105≤105 | ≤3∗105≤3∗105 | ≤1000≤1000 | ≤106≤106 |
题解
这题一看要维护边权就想到要用迪杰斯特拉,然后最后把答案乘上点的权值,直接拿下
第四题
4. 买物品
题目ID:4372必做题100分
时间限制: 1500ms
空间限制: 524288kB
题目描述
一天 sx 经过一家商店,他看中了 nn 个物品,在某些强大的力量的帮助下,sx 获得了如下优惠:每个物品价格均为 11 ,如果选择两个相邻的物品,会优惠 11 元,但同一个物品不能被同时选择两次。 由于 sx 手头上的钱只有 mm 块钱,因此对于某些物品,sx 可能不买。现在 sx 想知道对于所有的 k∈[0,m]k∈[0,m],购买的价格恰好为 kk 的方案数,答案对 998244353998244353 取模。
不同方案的定义:设用方式1购买的单个物品的集合为 S1S1,方式2的 物品对 集合为 S2S2,在价格为 kk 的情况下,两种方案对应的集合 S1S1 或 S2S2 至少有一者不同。
输入格式
第一行一个正整数 QQ,表示数据的组数。
接下来 QQ 行两个正整数 nn, mm
注意:测试点包含多组数据
输出格式
一共 QQ 行,每行 m+1m+1 个整数,第 kk 个整数表示当购买的价钱恰好为 kk 时的方案数。
样例
Input 1
3 2 2 3 3 10 10
Output 1
1 3 1 1 5 5 1 1 19 145 575 1289 1683 1289 575 145 19 1
样例解释
约定解释中一对大括号表示一组数据,一对小括号表示一起买。
对于第二个样例:
K=0:Ø
K=1:{1}, {2}, {3}, {(1,2)}, {(2,3)}
K=2:{1,2}, {1,3}, {2,3}, {1,(2,3)}, {(1,2),3}
K=3:{1,2,3}
数据范围
对于 20%20% 的数据 n≤20n≤20
对于 50%50% 的数据 ∑n≤103∑n≤103
对于 100%100% 的数据 2≤n≤1092≤n≤109, ∑m≤103∑m≤103,Q≤5Q≤5
题解
这题用的是动态规划,定义 ( dp[i][j] ) 表示前 ( i ) 个物品中,花费恰好 ( j ) 元的方案数。由于相邻物品可以选择成对购买,需要考虑是否选择当前物品以及是否与前一个物品成对购买。
- 不选第 ( i ) 个物品:方案数为 ( dp[i-1][j] )。
- 单独选第 ( i ) 个物品:方案数为 ( dp[i-1][j-1] )。
- 与第 ( i-1 ) 个物品成对购买(方案数为 ( dp[i-2][j-1] )。
因此,状态转移方程为: dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + dp[i-2][j-1]
总结
这次比赛可谓是本蒟蒻太菜了。。。没有想到很多题目的正解,下次继续努力

384

被折叠的 条评论
为什么被折叠?



