OI做题总结

数学竞赛蓝书上与OI/ICPC有关内容也可阅读
OI考前注意事项见川外团队
骗分导论见腾讯微云

一位大佬的总结

TOC

动态规划

1.如果题目有单调性,可以从小到大或者从大到小考虑 例题:POJ2279

2.方程可以:如何求出一个状态和如何用一个已知状态去求出其他的状态

3.如果遇到从序列两端取数的DP题可设f【i】【j】表示已经取了i个数,左边取了j个数的答案
例题:luogu1005

4.DP怪题:NKOJ1017设f[i][j]表示前i个积木,高度差为j时高塔的高度

5.遇到序列不降问题,通常将第i个数加i转化为升序问题讨论;同理,遇到升序问题,也可将第i个数减i转化为序列不降问题讨论

6.如果遇到有后效性的DP,一种解决方法为可以借助SPFA算法的思想进行动态规划直至所有状态不能再更新

7.子树合并类树形背包DP的时间复杂度大约是O(n^2)luoguP1273。其实这种写法是有问题的,会被一条链卡成3次方。真正实现见这里(好好体会为什么这么先转移后加子树的方法是“每两个点只会在他们的LCA处被枚举到一次”)

8.DP的时候当前状态也有可能更新当前状态

9.只关注可行性的背包可以使用贪心降低复杂度ACWING281

10.最大最小值的所有来源见蓝书P285

11.一个不严格单调序列可以给每个位置加上这个位置的下标将其变成严格单调序列LOJ10235

12.对于覆盖问题,可以计算每一个元素,每一个元素最终的大小是最后的值,意为中间的操作可以随意调换顺序 luogu4170

13.三进制状压DP注意新状态进队的时候要判重

14.单调队列优化的时候可以考虑多个因素,不一定非要只考虑一个因素

15有种优化技巧叫点边互换

16.有时用当前推未来可以避免一些讨论

17.动态规划将值设为无穷大的意义就是这个状态不合法(即任何一个状态不能从这个状态转移过来)。对于无穷的应用

18.使用滚动数组的时候一定要每次都进行初始化,且对于每一个状态要判断此状态是否合法以及需要用到的转移的状态是否合法(因为滚动数组可能没有初始化掉)

19.如果背包的时候价值值域很小但是容量值域很大,可以考虑将两个状态对调,即 f [ i ] f[i] f[i]表示得到价值为 i i i的物品所需要的最小体积

20.区间DP既可以考虑转移+最后一步干什么,也可以考虑第一步干什么+转移

21.单调队列优化DP若方程是分段函数则可以尝试化简为一个单调队列或者用多个单调队列在各个具有单调性的段上进行单调队列。注意deque很慢,尽量手写双端队列,除了时间来不及

22.树形DP不一定非要将当前正在DP的子树与整棵树隔离开来,也可以考虑当前子树对整棵树的贡献例题1例题2

23.多进程DP问题可以将某一进程的状态设为数组下标。如此题

24.DP其实和搜索是相通的。写DP时可以通过减去无用转移和无用状态来减少时间复杂度

25.当我们想出一个正确的DP方程却无法“”优化“时间复杂度时,可以将此方程写到纸上,在保证阶段在最外层循环的情况下,变换内层循环,看是否能够用单调队列进行优化。其实写下方程后这步操作可以用此方法解决:使某一变量进行变化,看是否满足单调性。例题(也看一下这种斜线性前缀和是怎么处理的)

26.在写完DP方程后可以把要求的答案写出来。若发现只关心某些数值的相对大小,则可以将这些数值缩小一维,变成a与b的差为c的dp数组,从小降低复杂度。如Emiya家今天的饭。差值可能为负数,记得数组移位

27.DP时转移次数最少可能对应题目说的一些东西,而需要转移次数最少就是将DP值偏移一个状态量INF。例题。其实偏移量只是为了方便理解,可以看看本人代码不带偏移量的做法

28.培增优化DP:在每个第一维度状态下(i),第二维度(j)变化一次的结果不变(即只要i固定,j与DP值呈一一对应关系)可以用倍增优化DP

29.注意看这道题自己的代码实现(滚动数组直接复制改动的值,剩下的不变,达到优化DP的目的)

30.在使用费用提前计算时,一定要搞明白提前计算的费用会不会被搞重复,如此题,体会一下枚举释放哪个犯人时先释放和后释放的区别(其实这道题看成石子合并会更好)

31.有时候DP时,若每个物品都一模一样,可以尝试不设f[j]表示选前j个物品,而表示选j个物品(即无顺序)

32. O ( n l o g n ) O(nlogn) O(nlogn)求LIS

33.子树合并类DP有时记得要将DP数组复制一遍。如此题

34.DP的两种推法(从已知扩展到未知和直接推导未知)不仅可能有思维难度上的差异,也有可能会对卡常造成影响。比如此题,尽管此题已经不能用trie+DP通过,但是可以看一下这篇题解,这里就是用的已知扩展到未知,尽管是为了方便trie树,但其实如果直接推导未知(将单词倒着插入trie)不难发现常数会更大的。

35.DP好题solution

36.关注一下这道题吧,solution

37.很好的一道牌类DP总结

38.经典的树形solution

39.好题solution

40.轮廓线DP+博弈论DP:chess总结

41.如何对质数进行状态压缩:此题

42.状态很神奇,统计方式也很神奇的一道题目,可以看这篇题解,如果看不懂统计的时候可以看看他写的代码,如果还看不懂可以参考这篇题解里面讲统计的那一部分文字

43.重合区间类DP的一种新的状态方程的设计(只总结了第一问,还没看第二问):洛谷P1973总结

44.一道数位统计DP好题总结

45.带重复元素的康拓展开:洛谷2518,这题算组合数的时候注意一个细节:我们让组合数溢出问题也不大,因为答案保证了不超过long long,溢出了的组合数我们根本用不掉

1.可通过多次异或判断奇偶关系

2.K位储存系统就是% 2 K { 2 ^ K } 2K(poj2115)

3.acwing273记住蓝书引理

4.蓝书P269思考题

5.C++string类型有一种操作叫streamstring
streamstring简介

6.记得longlong

7.注意看luogu2532高精度实现方法。有点类似于压位高精

8.注意变量可能编译过但是不能过NOIlinux,如y1,next等

9.领略一下这道题的思路

10.根据恶心的儒略日,可知日期模拟用二分

11.两个数q[i],q[j] (i≤j) 不能被放入同一个栈中,当且仅当存在 k,k>j, 且 q[k]<q[i]<q[j]此题

12.转义字符要双写哦

13.这道题的奇葩性质

14.若要求在一个序列上放数字,使得下标差为奇数的互不相同?可以1 2 1 2 1 2 …这么放。此题拓展

15.若有若干个二元组(a,b),需要找类似于满足 L ≤ a ; b < = R L≤a;b<=R Lab<=R的二元组个数,可以将这些二元组看做二维平面上的点,然后离散化用树状数组(无修改)求即可,如此题。也可以像蓝书一样用分块处理

16.蓝书P172引理

17.位运算枚举子集见OIwiki。相反操作见下

for(int S=i;S<(1<<n);S=((S+1)|i))
{
	//S的子集是i
}

18.蓝书P197用前缀和以及异或处理奇偶的方法

19.多组数据时,初始化一定要注意是否超时。有时保证数据总量在一定范围内但是数据组数很大这时候将数组全部清空可能超时

20.此题简单结论

21.维护序列可重集查重(看看两篇题解的方法)第一篇第二篇这篇最后的tips也可看一下,优化常数

22. O ( 1 ) 64 O(1)64 O(1)64位乘法蓝书

23.三目运算符一定要打括号,防止优先级错误,一定!!

24.WQS二分详解

25.最好别乱用什么++i或者i++,如

st[++tp]=max(t[p].maxa,st[tp-1]);这是UB

26. O ( n + n / 1 + n / 2 + . . . + 1 ) = O ( n l o g n ) O(n+n/1+n/2+...+1)=O(nlogn) O(n+n/1+n/2+...+1)=O(nlogn)
O ( n + n / 2 + n / 4 + . . . + 1 ) = O ( n ) O(n+n/2+n/4+...+1)=O(n) O(n+n/2+n/4+...+1)=O(n)

27.注意多次乘除法可以用log转化为加减法,从而避免高精度(注意精度问题!判断两个数是否相等的时候最好用eps)。当然也可以哈希例题

28.异或相当于二进制不进位加法,所以对于一段数列c,有(后者表示异或和)
∑ i = 1 n c [ i ] ≥ ⨁ i = 1 n c [ i ] \sum_{i=1}^nc[i]≥\bigoplus_{i=1}^nc[i] i=1nc[i]i=1nc[i]
∑ i = 1 n c [ i ] = ⨁ i = 1 n c [ i ] \sum_{i=1}^nc[i]=\bigoplus_{i=1}^nc[i] i=1nc[i]=i=1nc[i],则 ∑ i = 1 n − 1 c [ i ] = ⨁ i = 1 n − 1 c [ i ] ( 其实此时对 [ 1 , n ] 任意一个子串都有相等成立 ) \sum_{i=1}^{n-1}c[i]=\bigoplus_{i=1}^{n-1}c[i](其实此时对[1,n]任意一个子串都有相等成立) i=1n1c[i]=i=1n1c[i](其实此时对[1,n]任意一个子串都有相等成立)
其实对任意一个非负整数数列也有异或和与加法和的奇偶性相同

29.若某一个值可以瞬间算出来,则不用保存省空间(如平面直角坐标系里两个固定的点的距离)

30.排序不等式:对于两个相同项数的数列A和B,若将两者元素进行随机一一配对并求和,则有同序和 ≥ ≥

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值