【信息机房】信竞知识普及

物理
【信息机房】信竞知识普及

用户头像
榴莲忘返 更新于2025-6-14 06:19:08

置顶:停更通知:因为作者需要备考期末和地生中考,被迫停止此贴更新,有问题可以提出,不定时回复

由于亲爱的母亲,时间不足,所以基本只能周一更,其他想更新的帮个忙,但格式不要太乱(必要时使用latex(虽然我不会))

国家竞赛中,信竞占了不可缺少的一部分,即使在这个论坛内也有玩信竞的,所以在此准备对信竞知识做普及到高级算法的研究(可能多为理论,代码会很少)。

也感谢大家可以分享自己已经知道的算法,可以当做分享站。

质心小姐姐如果觉得不太行,我会试着改改(希望能过,毕竟都是竞赛)

收起
33
32
共15条回复
时间正序
用户头像
榴莲忘返
1月前

自古沙发归作者

如果要进行初级学习,可以参考oi维基进行初级知识学习

这帖子可以,你可以详细讲一讲动规和贪心,生物信息那边需要

我都快忘没了哈哈哈哈

1条评论
用户头像
榴莲忘返
1月前

我的想法是电脑用一个账号更新,平板很多时候拿不到……

用户头像
榴莲忘返(llwf)
1月前

dp动态规划

(应 这个可以有 讲解)

注:此文内容以作者本人观点+网上参考资料为主,如有问题可及时提出

动态规划可以理解作递推的一种,只不过动态规划(以后简称dp或动归)

大多数时候可以简化为三步骤:

1.设计状态

这一步通过字面意思,可以理解为:为一个你想要求的答案准备一个状态来表示它。

在这里解释不太清楚,请访问如下题目:https://www.luogu.com.cn/problem/P1048

或简化题面:给定n个物品,给了一个时间T,然后每个物品都给出一个价值和选择所需的时间t(每个物品仅能选一次,也可不选),求在不超过时间T的情况下最多可以获得的价值

此题状态即可设为dp[i][j],表示在前i个物品中选择了总时长不超过j的最大价值

状态设计好就是关键,但状态往往需要进行优化,比如这道题,因为第i个物品选择仅可能与i-1所处状态(即dp[i]与dp[i-1])有关,也就是第i-2位就没有用处了,即可试图压缩第一维i,此处不多讲解,之后再说。

2.状态转移方程

状态转移方程就是根据状态转移过来,即根据一个已知状态推导出下一个状态。

比如还是上文这道题,状态转移方程为:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+v[i])

其中i为物品编号,j为时间,t[i]为第i个物品所需时间,v[i]为第i个物品价值

可以简单理解,在max中(默认你会部分基础,所以不多讲述一些基础知识,但可以发出询问)

第一项即可理解为不做选择(即不选择第i个物品)

第二项理解为做选择(即选择第i个物品),代价是t[i],但价值为v[i],需要寻找上一行状态预留t[i]的时间的最大价值再加上当前状态

3.初始化和求解

初始化中,需要考虑你的状态方程是如何设计,然后在没有任何状态下的初始值

比如这道题,因为在不做选择时价值为0,所以应初始化:

dp[0][0]=0;

但是对于dp其他的状态,需要根据转移方程来进行初始化,比如:

dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+v[i])

因为要取max,所以多用极大值来初始化,不多讲解

求解中,考虑题意中要求的状态是哪个,这道题就是满状态,即

dp[n][T]

其他题可能因题而异,甚至可能还会有求和、最大值等,不多讲解

动归主体就是这些内容,但是动归可不止这些,在普通动归的前提下延伸出很多,比如和图论结合形成树形dp等,这些之后有想了解者可以问问。

感谢观看

llwf 2025.05.30

尾注:端午假期快乐!

(排版如果不合适可以提出,下次修正)

2条评论
用户头像
IOIAKME
1月前
建议把题目内容简单说明一下
用户头像
榴莲忘返(llwf) 回复 IOIAKME
1月前

说明过,但是不太显眼……

用户头像
IOIAKME
1月前
我周末可以分享并查集和最小生成树,区间 dp
用户头像
IOIAKME
1月前
前缀和:

假设我们遇到这样一道题目:

输入 $n$ 个数,并给出一些区间 $[l_i,r_i]$,输出每个区间内数的和。

我们显然不能对于每个区间循环求和,这样会 TLE,所以我们需要更快的方法。

我们只需要注意到 $\sum_ni=l}^{r}a_n=\sum_{n=1}^{r}a_n-\sum_{n=1}^{l-1}a_n$,就行了。

因为我们需要求一个区间的和,只需要先求从第一个数到区间末尾的和,减去不属于这个区间的部分,就行了。

为什么这样可以防止 TLE 呢?

假设我们获得了数列 $a_1,a_2,\dots,a_n$,我们可以用 $\mathrm{O}(n)$ 的复杂度求出数列 $s_i=\sum_{n=1}^{i}a_n$,然后如果我们要求 $\sum_{n=l}^{r}$,就可以用 $s_r-s_{l-1}$,然后就没有然后了。
3条评论
用户头像
IOIAKME
1月前
$\sum_{n=l}^{r}a_n=\sum_{n=1}^{r}a_n-\sum_{n=1}^{l-1}a_n$
用户头像
IOIAKME
1月前
补充一下,$\sum_{n=l}^{r}a_n=a_l+a_{l+1}+\dots+a_{r-1}+a_r$,这下你们应该能看懂 $\sum$ 符号了。
用户头像
宇宙的琴弦 回复 IOIAKME
1月前

看不懂∑还怎么玩

用户头像
IOIAKME
1月前
分享一道有趣的题:

存在数列 $a_1,a_2,\dots,a_n$ 和整数 $k$,计算 $b_i=a_i|x$,其中 $|$ 表示按位或。求出使 $b_1=b_2=\dots=b_n$ 不成立的数 $x$,且 $x<2^{32}$。

$0\le a_i<10^9,1<n<10^6$

首先,我们需要了解逻辑或的性质。

$0|0=0$
$0|1=1$
$1|0=1$
$1|1=1$

(以下性质前面都加上 $\forall x$)

性质 1:

$x|y=y|x$

性质 2:

$(x|y)|z=x|(y|z)$

性质 3:

$x|0=x$

性质 4:

$x|1=1$

按位或就是对两个数的每一位进行逻辑或。

e.g. $5|6=(101)_2|(110)_2=((1|1)(0|1)(1|1))_2=(111)_2=7$

性质 6:

$\forall n,x|(2^n-1)=2^n-1$

性质 7:

$x|0=x$

然后,如何解决这个问题呢?

首先,为什么把 $a$ 中的每个数与 $x$ 进行或运算,结果的值会相等?性质 4 说明了不同的数经过或运算之后结果可能相同,我们需要尽可能避免 $1$。

显然,如果 $n|a=m|a$,则 $n|(a|k)=m|(a|k)$。

这时 $a|k$ 的二进制写法中 $1$ 的个数一定大于等于 $a$,所以如果 $a$ 的二进制写法中只有一个 $1$,那么不管怎么改变其他位,$m|a=n|a$ 依然成立。

但我们最不希望原式成立。

所以,我们可以先造一个二进制数 $(1)_2$,与每个数进行或运算,如果结果全部相等,不管前面每一位怎么改变,结果还是相等,所以如果全部相等,则 $x$ 的最后一位一定是 $1$。

然后我们可以尝试 $(10)_2,(100)_2$ 等等。注意 $a_i<10^9$,所以只需要试 $31$ 次就可以了。别忘记最后把它们组合在一起。
用户头像
杂七杂八的小杂鱼
1月前

如果需要的话,代码方面可以交给我

在下24年省一[嘿嘿😜]

1条评论
用户头像
榴莲忘返
1月前

orz

orz

用户头像
AE86
1月前
数竞党,对信息技术有兴趣,想学一门编程语言,倾向于py或者java,有一点基础,有什么教材或者学习路径推荐吗
7条评论
用户头像
杂七杂八的小杂鱼
1月前

你要是想学,这边还是建议Python 。Java之前很火但是比较繁琐,刚入门像速成的话不太建议[虽然我是学Java和C语言的]你还在学数竞,py还是比较适合你

用户头像
杂七杂八的小杂鱼
1月前

教材的话你可以去洛谷官网找找,它的教材还是比较好点的,洛谷的题库也可以拿来练练手,北大题库的题比较经典,但是近几年缺少维护[服务器好像是崩了还是咋回事,我的账号是登不上去了]数据有点落后

用户头像
AE86 回复 杂七杂八的小杂鱼
1月前

谢谢😘

用户头像
AE86 回复 杂七杂八的小杂鱼
1月前

其实我的要求不是很高,没往信奥那边考虑

用户头像
杂七杂八的小杂鱼 回复 AE86
1月前

不管如何py绝对是萌新最好上手的

用户头像
IOIAKME 回复 杂七杂八的小杂鱼
1月前

显然 brainf  k 才是最好上手的。

十五分钟就能学会

用户头像
sigma让每个孩子都飞起来 回复 IOIAKME
7天前

bf编译器是个学过编程的人都能手搓13.png

用户头像
杂七杂八的小杂鱼
1月前
我主页会更新代码的讲解,有兴趣的可以进来看看
用户头像
榴莲忘返(llwf)
1月前

贪心算法(这个可以有 赞助 提议讲解)

贪心算法是一种很 “名副其实” 的算法,因为它的本质就是如同咱们的思想一样,每一步都选择当前最优解。

当然有人就会有疑问了:“那这样思考,不会出现错误吗?难道这样就一定是最优解吗?”当然不是了。

经典栗子就是如同你玩游戏,你选择了可能当前最优的装备,但你越到后面可能会感觉从这个装备开始走的分支不再是最优,所以你便被 defeated 了。

贪心算法典型不能用的题目就是上文所说,也就是每一种选择都会对之后的选择产生影响,那么这种题一般不可用贪心。

来道经典题目:

石子合并:有n堆石子,每堆石子大小不同,你的任务是每次合并任意两堆,问你最小代价(每次合并的代价就是两堆石子大小之和)

肉眼便可分析出来,这道题是典型两次决策之间没有任何联系的题目,使用高贵的脑子一分析,拍案怒起表示,每次要合并最小的两堆,这样总代价就是最小的,因为你越早合并出更大的石堆,在最后累积这个石堆的代价便会更大,所以还不如从小合并。

那么这道题的正解就是通过对所有石堆进行从小到大的排序,然后从前到后依次合并,计算总代价。

贪心核心本质已经说完,但是它也是有无限潜力的,它可以同很多算法合并,组合出最优算法(即使它本身不一定最优,但合起来就是最优算法)。

感谢聆听,之后也会同步到CSDN上进行教学。

2025.6.6

(这次使用markdown,平板上感受不佳请提出)

3条评论
用户头像
宇宙的琴弦
1月前

但是最后两堆石子的大小之和不是相等吗

用户头像
5800
1月前

但是两个小石堆组合后可能比之前的大(比如成为倒数第三), 是不是每次合并后重新比较是最优解

用户头像
宋定谔的皮卡π号
1月前

hello 好久不见

用户头像
ber·CH4
1月前

我支持   

用户头像
IOIAKME
1月前
区间 dp

区间 dp 就是把问题拆分成区间来解决问题。

例题:

一个纸带上被分为很多格,要求把它涂上颜色成为指定的样子,每次都只能涂一段区间,求最少涂色次数。(一个字母代表一种颜色)

输入输出样例及解释:

RGB

3

(先涂成 RRR,然后涂成 RGG,然后 RB)

RBRBR

3

(RRRRR RBBBR RBRBR)

首先,定义 dp[l][r] 表示让 l 到 r 的区间里颜色符合题意需要的次数,列出状态转移方程:

$$dp[l][r]=\begin{cases}1&l=r\\
dp[l+1][r-1]+1&a[l]=a[r]\\
dp[l][r-1]+1&以上情况都不满足\end{cases}$$

其中 $a[i]$ 表示题目要求的第 $i$ 个颜色。

然后按照普通 dp 的方法做就行了。
1条评论
用户头像
IOIAKME
1月前

$$dp[l][r]=\begin{cases}1&l=r\\dp[l+1][r-1]+1&a[l]=a[r]\\dp[l][r-1]+1&以上情况都不满足\end{cases}$$