blog原题整理

NOI复习计划


idea&考试策略

不管是什么考试都需要先把暴力分写满 即使发现正解就在身边(必须督促自己完成
知识点:线段树分治(填坑,天坑
线段树分治大约看了看 没写题 很虚毕竟自己菜
仔细阅读题面 不懂提问
如果发现需要spj的题目需要手写 请仔细检查spj是否写挂 有关数据边界如0 一定特判!
思考题目 如果没有做法 捡分一定写
在思考的时候 如果有一些条件没有很好的利用 就考虑跳出思维圈 所有暴力先打 验证读题
注意dp的时候不能超过n+1 尤其是多组数据的时候有可能会越界 越界到上一次算过的地方
有一些noip的题只是大略看了看就没放在这里了

动态规划

补充:
暴力dp的是否如果发现复杂度不对可以考虑我需要统计的是不是一个前缀和 可以考虑用前缀最大值或者
数据结构维护我的dp数组!! 状压dp的时候不仅可以开一个数组表示两个状态是否可行 而且可以
直接开一个数组表示 当前状态s是否可行 避免dp时候的复杂度增加
bzoj 1026 [SCOI2009]windy数
数字太大发现无法直接做 于是发现仅仅和位数有关
https://blog.csdn.net/elijahqi/article/details/78885175
bzoj1096 [ZJOI2007]仓库建设 斜率优化dp
https://blog.csdn.net/elijahqi/article/details/78888642
预处理trick cost[i]从1~i需要的花费
把j+1~i全部搬到i的代价是多少 就是
cost[i]-cost[j]-sw[j]*(x[i]-x[j])
AtCoder Regular Contest 068 F - Solitaire
https://blog.csdn.net/elijahqi/article/details/78907912
发现这是一个v字形 所以 取数字一定是两条递降的序列 那么dp求k-1的方案数
dp[i][j]前i个数字 最小的数字是j的方案数 然后后半部分直接 2nk1 2 n − k − 1 即可
poj1141 Brackets Sequence
https://blog.csdn.net/elijahqi/article/details/78918486
设dp[i][j]表示将区间i,j满足条件的最小代价 枚举中间补括号的地方
noi1997 积木游戏
https://blog.csdn.net/elijahqi/article/details/78931942
设f[i][j][k]表示 我当前处在第i堆 然后我现在用到第j个积木 然后我现在在处理第j个积木的第k个平面
bzoj1609 [Usaco2008 Feb]Eating Together麻烦的聚餐
https://blog.csdn.net/elijahqi/article/details/78932404
设f[i][num]表示我现在处于第i号位置 我选的数是num的代价是多少
bzoj1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛
https://blog.csdn.net/elijahqi/article/details/78933298
时间暴力转移
poj1050 To the Max
https://blog.csdn.net/elijahqi/article/details/78934776把列压在一起按照一行的做
poj1160 Post Office
https://blog.csdn.net/elijahqi/article/details/79047927 一个邮局一定放在中间最合适
dp[i][k]表示前1~i个位置中我放了k个邮局的最小代价是多少 然后o(n^2*m)
URAL 1143 Electric Path
https://blog.csdn.net/elijahqi/article/details/78936909
凸包性质求哈密顿路径最小 类似区间dp即可
bzoj1222 [HNOI2001]产品加工
https://blog.csdn.net/elijahqi/article/details/78991791
枚举一种机器做了i时长求另一个机器花费最小时间
codeforces 833B The Bakery
https://blog.csdn.net/elijahqi/article/details/78992720
考虑将式子放在线段树叶子节点 每次新增加一个数字会对Pre[i]~i-1产生贡献
codeforces 835D Palindromic characteristics
https://blog.csdn.net/elijahqi/article/details/78995382
区间dp枚举长度
bailian4122 切割回文
https://blog.csdn.net/elijahqi/article/details/79053264
记忆非常深dp[i]表示前i个的最小代价 暴力转移即可
poj1548 Robots
https://blog.csdn.net/elijahqi/article/details/78998495
捡一个偏序集合 那么n^2 Dilworth
codeforces 913C Party Lemonade
https://blog.csdn.net/elijahqi/article/details/79008889
先dp最小代价 然后按位置贪心即可
bzoj1131 [POI2008]Sta
https://blog.csdn.net/elijahqi/article/details/79018192
考虑在子树转移的时候 我们转移之后会有什么影响 然后每次往哪个方向转移的时候计算即可
bzoj2201 彩色圆环
https://blog.csdn.net/elijahqi/article/details/79014721
dp[i][0/1]表示前i个珠子 首尾颜色是否相同答案的期望是多少
转移的时候枚举前面一段的长度是多少 分别算一下这个长度相同的概率即可 如首尾不相同则方案有(m-2)/m的概率
如首尾相同则只有1/m的概率
bzoj3029 守卫者的挑战
https://blog.csdn.net/elijahqi/article/details/79018803
内存开不下于是发现当背包容量超过200其实就不行了
bzoj4318 OSU!
https://blog.csdn.net/elijahqi/article/details/79027996
把平方的期望单独提取出来计算即可
bzoj3470 Freda’s Walk
https://blog.csdn.net/elijahqi/article/details/79029647
让我回想起了 期望倒着算的这句名言
倒着求每个点到终点的期望边数 正着拓扑每个点从1到这里的概率 然后枚举删除每条边的针对答案重新计算即可
bzoj1296 [SCOI2009]粉刷匠
https://blog.csdn.net/elijahqi/article/details/79055898
dp之后再dp 分别预处理每行我需要涂多少次我可以涂对的数量 然后因为一行只能刷一次所以再在行之间转移的时候
就设dp[i][j]表示前i行刷了j行的代价即可
poj2392 Space Elevator
https://blog.csdn.net/elijahqi/article/details/79055945
完全背包的应用 多记录一些东西即可
poj1737 Connected Graph
https://blog.csdn.net/elijahqi/article/details/79058146
f[n]=n1k=1f[k]f[nk]Ck1n2(2k1) f [ n ] = ∑ k = 1 n − 1 f [ k ] ∗ f [ n − k ] ∗ C n − 2 k − 1 ∗ ( 2 k − 1 )
bzoj3257 树的难题
https://blog.csdn.net/elijahqi/article/details/79054715
dp[i][j][k]表示当前在i子树内 黑色有j个 白色有k个的代价 然后枚举每种状态尝试背包转移即可
bzoj2287 【POJ Challenge】消失之物
https://blog.csdn.net/elijahqi/article/details/79060602
先dp出最简单的那个东西 然后我们可以再dp一下考虑容量为x的方案实际上是由 xvi x − v i 这个容量不包含 i物品的东西加上i物品会增加一些方案数我们只需要把他们减去即可
bzoj3437 小P的牧场
https://blog.csdn.net/elijahqi/article/details/79060467
斜率优化 同:锯木厂选址
bzoj1492 [NOI2007]货币兑换
https://blog.csdn.net/elijahqi/article/details/79101623
cdq分治解决斜率不单调的dp 维护一个凸包 然后每次要找个和凸包相切的决策点来转移
bzoj3672 [Noi2014]购票
https://blog.csdn.net/elijahqi/article/details/79111202
对于dp式子的化简还是不长记性…看到一些无关的项可以分类一下也许就好维护了
dp[i]=min{dp[j]+(dis[i]-dis[j])*p[i]+q[i]}
dp[i]=q[i]+dis[i]*p[i]+min{dp[j]-dis[j]*p[i]}
bzoj4518 [Sdoi2016]征途
https://blog.csdn.net/elijahqi/article/details/79118010
似乎可以wqs二分 做到复杂度非常优秀 这里写的是 n2 n 2 做法
s2=i=1n(x[i]x¯)2 s 2 = ∑ i = 1 n ( x [ i ] − x ¯ ) 2
s2=mi=1nx[i]2sum[i]2 s 2 = m ∗ ∑ i = 1 n x [ i ] 2 − s u m [ i ] 2
bzoj1097 [POI2007]旅游景点atr
https://blog.csdn.net/elijahqi/article/details/79127875
对于k个点的状态状压做 然后枚举经过所有点之后 在最后停留在某个点的最小距离再加上 这个点到终点的最小距离即可
对于最短路我们可以知道有常用套路 枚举一个点然后把两段路径拼接起来
bzoj1855&luogu2569 股票交易 单调队列优化
https://blog.csdn.net/elijahqi/article/details/79142655
化简 然后发现式子有个常数项和 上一个决策点的位置有关单调队列化简
bzoj1076 [SCOI2008]奖励关
https://blog.csdn.net/elijahqi/article/details/79135067
设dp[i][s]表示我1-i-1轮已经获得了s状态的宝物 那么我一直做完K轮我的期望是多少 期望倒着做 因为正着可能从无效状态转移
bzoj2073 [POI2004]PRZ
https://blog.csdn.net/elijahqi/article/details/79156421
状压dp 设dp[s]表示s状态我已经搬运完了 的最小时间是多少 首先预处理time&ww数组 然后枚举子集进行转移 注意转移的时候我有可能我自己这一次就是将他们全部搬运完的那一次因为我的枚举子集的方法无法枚举到0 所以我拎出来特判写一写的
bzoj3675&UOJ104 [Apio2014]序列分割
https://blog.csdn.net/elijahqi/article/details/79157394

f[i1][k1]+sum[k1](sum[j]sum[k1])sum[j](sum[k1]sum[k2])sum[j]<f[i1][k2]+sum[k2](sum[j]sum[k2])<f[i1][k2]f[i1][k1]+sum[k1]2sum[k2]2>f[i1][k2]f[i1][k1]+sum[k1]2sum[k2]2sum[k1]sum[k2] f [ i − 1 ] [ k 1 ] + s u m [ k 1 ] ∗ ( s u m [ j ] − s u m [ k 1 ] ) < f [ i − 1 ] [ k 2 ] + s u m [ k 2 ] ∗ ( s u m [ j ] − s u m [ k 2 ] ) s u m [ j ] ∗ ( s u m [ k 1 ] − s u m [ k 2 ] ) < f [ i − 1 ] [ k 2 ] − f [ i − 1 ] [ k 1 ] + s u m [ k 1 ] 2 − s u m [ k 2 ] 2 s u m [ j ] > f [ i − 1 ] [ k 2 ] − f [ i − 1 ] [ k 1 ] + s u m [ k 1 ] 2 − s u m [ k 2 ] 2 s u m [ k 1 ] − s u m [ k 2 ]

发现这个sum是具有单调性的 且或的分数和切割顺序是无关的(这一点一定要认真分析dp
bzoj3831 [Poi2014]Little Bird
https://blog.csdn.net/elijahqi/article/details/79157440
维护这一个区间内的体力最小值 Notice:在维护单调队列的时候如果体力值相同记得按照高度递减来维护
bzoj4011 [HNOI2015]落忆枫音
https://blog.csdn.net/elijahqi/article/details/79210732
对于DAG上的生成树来说 每个点的入度只能是1 那么我们直接统计每个非根节点的度数即可 但是用重复的怎么办 统计每个环除了环上的点 度数的乘积然后减去即可
bzoj5108 [CodePlus2017]可做题
https://blog.csdn.net/elijahqi/article/details/79260465
因为位与位之间是互不影响的 做的时候就递推直接搞就可以 但是注意 如果前一位是空的我随意添加数字来构造 注意我存在我当前位置和前一个位置只差一个的情况 这样的话我就需要特判 避免我这一位同时被我钦定为1或者0 (其实并不能算作dp 只能说是递推
luogu4187 [USACO28JAN]Stamp Painting
https://blog.csdn.net/elijahqi/article/details/79243432
先用排列组合算出没有k这个限制条件的所有可能方案,即n的m次方。再算出不符合方案的情况,也就是没有一个长度至少为k的相同颜色的块减去即可。想要算出不符合的方案总数也很简单,一个简单的一维DP就行了,因为我们规定不能有长度超过k的块,所以最多只有连续k-1个格子颜色相同
bzoj1495 [NOI2006]网络收费
https://blog.csdn.net/elijahqi/article/details/79336254
不确定lca的状态所以需要dfs一下lca的状态然后根据每个lca的状态背包dp 神题 看其他大佬题解吧
bzoj4027 [HEOI2015]兔子与樱花
https://blog.csdn.net/elijahqi/article/details/79337911
给儿子排序然后贪心从小到大删除 似乎很有作用
bzoj4813 [Cqoi2017]小Q的棋盘
https://blog.csdn.net/elijahqi/article/details/79342945
f[x][j]=max(f[x][j],g[x][jz]+f[y][z1]); f [ x ] [ j ] = m a x ( f [ x ] [ j ] , g [ x ] [ j − z ] + f [ y ] [ z − 1 ] ) ;
g[x][j]=max(g[x][j],g[x][jz]+g[y][z2]); g [ x ] [ j ] = m a x ( g [ x ] [ j ] , g [ x ] [ j − z ] + g [ y ] [ z − 2 ] ) ;
f[x][j]=max(f[x][j],g[y][z2]+f[x][jz]); f [ x ] [ j ] = m a x ( f [ x ] [ j ] , g [ y ] [ z − 2 ] + f [ x ] [ j − z ] ) ;
分为我当前处于x节点 走j步数是否会走回来的最大点数
bzoj1912 [Apio2010]patrol 巡逻
https://blog.csdn.net/elijahqi/article/details/79453953
树上最长链 没有负数的情况可以直接spfa (noiwc惨痛经历
有负数的情况可以 树形dp 需要删除求第k大的路径的时候只需要树形dp一次将路径反向 然后再dp这样暴力几次即可
codeforces 587B Duff in Beach
https://blog.csdn.net/elijahqi/article/details/79490862
bzoj1009&&luogu3193 [HNOI2008]GT考试(KMP+DP+矩阵倍增)
https://blog.csdn.net/elijahqi/article/details/79617681
f[i][j]表示在第i号时 后缀中有j位与不吉利的前缀j位相同 的个数有多少
apio2010特别行动队
https://blog.csdn.net/elijahqi/article/details/79646322
f[i]=max(f[j]+a(sum[i]sum[j])2+b(sum[i]sum[j])+c) f [ i ] = m a x ( f [ j ] + a ∗ ( s u m [ i ] − s u m [ j ] ) 2 + b ∗ ( s u m [ i ] − s u m [ j ] ) + c ) 如果j>k且j比k更优
f[j]f[k]+asum[j]2asum[k]2+b(sum[k]sum[j])>2a(sum[j]sum[k])sum[i] f [ j ] − f [ k ] + a ∗ s u m [ j ] 2 − a ∗ s u m [ k ] 2 + b ∗ ( s u m [ k ] − s u m [ j ] ) > 2 ∗ a ∗ ( s u m [ j ] − s u m [ k ] ) ∗ s u m [ i ]
BJ 集训8 测试 B 新访问计划
https://blog.csdn.net/elijahqi/article/details/79646277
其实是个wqs二分 二分使用一次跳跃的费用 然后像之前cqoi2017的一道题去进行树形dp即可
bzoj1925&&luogu2467 地精部落
https://blog.csdn.net/elijahqi/article/details/79690815
只能说我已经看不懂了
luogu3856 [TJOI2008]公共子串
https://blog.csdn.net/elijahqi/article/details/79704375
相当于统计子序列个数 之前考试写暴力的时候还觉得似曾相识没写出来
现在看来如果直接写暴力的话可以枚举最后一个位置是什么 然后暴力dp即可 但是因为会有重复的出现所以当重复情况出现的时候我们需要减去前面出现的 然后再推导一下dp式子即可
fzu2129
https://blog.csdn.net/elijahqi/article/details/79704396
设d[i]表示前i个元素的子序列个数,则状态转移方程为:
第i个元素a未出现过:d[i] = (2 * d[i-1] + 1) % mod;
第i个元素a出现过:d[i] = (2 * d[i-1] - d[p[a]-1]) % mod;(注意判负)
hdu5791 dp
https://blog.csdn.net/elijahqi/article/details/79704402
f[i][j]=(a[i]==b[j])f[i1][j]+f[i][j1]+1 f [ i ] [ j ] = ( a [ i ] == b [ j ] ) f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] + 1

(a[i]!=b[j])f[i1][j]+f[i][j1]f[i1][j1] ( a [ i ] ! = b [ j ] ) f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] − f [ i − 1 ] [ j − 1 ]
luogu3847 tjoi2007 调整队形
https://blog.csdn.net/elijahqi/article/details/79719565
一开始我的循环没想对,但是由于我们每一次都要利用上一次的状态所以我们最外层循环应该使用长度
f[i][j]表示i到j 满足条件区间内需要更改的最小值
假如a[i]==a[j]那么 f[i][j]直接从f[i+1][j-1]的状态继承过来
如果不等于那么f[i][j]=要么改变一个人的颜色(f[i+1][j-1]+1),要么f[i+1]j或者f[i][j-1]
BJ 集训测试12 同构
https://blog.csdn.net/elijahqi/article/details/79727999
搞出整棵树的深度的序列 然后乱搞 尝试 发现满足两个序列深度的lcs 用总长度减去即可
BJ 集训测试12 coin
https://blog.csdn.net/elijahqi/article/details/79732800
bzoj4588 CoinChange
https://blog.csdn.net/elijahqi/article/details/79788011
这两题同理一个拉格朗日插值 一个矩阵快速幂暴力转移而已
此处输入图片的描述
此处输入图片的描述
bzoj1030 [JSOI2007]文本生成器
https://blog.csdn.net/elijahqi/article/details/79790442
因为求>=1的不好求 所以转化成求有多少个不会出现 然后用总数减一下即可
bzoj1025 [SCOI2009]游戏
https://blog.csdn.net/elijahqi/article/details/79830218
于是分组背包做一下即可设dp[i][j]表示用前i个质数凑出和为j的方案数 这个j我从0开始只是每次带着走而已..
bzoj4985
二分答案 然后用一个队列维护dp
这个queue也相当于f f[i]表示使i这个位置成为1前面的最小补充数
bzoj3162 独钓寒江雪
https://blog.csdn.net/elijahqi/article/details/79834578
树形hash 每次把子树的hash值*size[子树]存起来即可
剩下的还是贴官方题解吧
n 种物品,每种物品无限个,求取 m 个的组合数。 Cmn+m1 C n + m − 1 m
http://vfleaking.blog.163.com/blog/static/17480763420134452440444/
bzoj3997[TJOI2015]组合数学 dilworth定理
https://blog.csdn.net/elijahqi/article/details/79835309
考虑原图可以先看作一个dag
最长反链的定义就是在一个偏序关系集里 任意两两之间都不能比较大小的这样一个集合
最小路径覆盖指:选择最少的路径数,使得每个点在所有路径中出现至少1次
根据dilworth定理可以确定 最小链覆盖等于最长反链 因为带权值所以把这些点看成多个点即可
codeforces 453B Little Pony and Harmony Chest
https://blog.csdn.net/elijahqi/article/details/79783892
考虑到60以内的质因数只有17个所以我们考虑可以状压dp解决这个问题
bzoj4553 [Tjoi2016&Heoi2016]序列
https://blog.csdn.net/elijahqi/article/details/79843201
分析性质 然后会 n2 n 2 dp 用cdq分治优化即可
bzoj1408 [Noi2002]Robot
https://blog.csdn.net/elijahqi/article/details/79845801
bzoj5248[2018多省省队联测]一双木棋
https://blog.csdn.net/elijahqi/article/details/79857852
因为只有10行所以可以考虑状压一下 以前面做过的每一行有多少个所谓状态10进制状压即可 另外因为状态跑不满 所以直接hash表存一下 然后转移即可
bzoj5185 [Usaco2018 Jan]Lifeguards
https://blog.csdn.net/elijahqi/article/details/79874902
暴力dp这个方程相当于枚举上一个没有被删除的区间k,然后将k+1~i-1全部删除 推导公式 维护n个单调队列 优化dp
bzoj5157 [Tjoi2014]上升子序列
https://blog.csdn.net/elijahqi/article/details/79956651
在树状数组中维护以权值a[i]为结束的dp值 然后每个dp[i]表示增量 然后 最后注意去重即可
bzoj4890 [TJOI2017]城市
https://blog.csdn.net/elijahqi/article/details/79997427
枚举边删除 然后暴力搜索直径 将直径的中点连接起来 选一下最远距离即可
bzoj1924&luogu2403 所驼门王的宝藏
https://blog.csdn.net/elijahqi/article/details/80101919
建边难度大的题
codeforces 165E Compatible Numbers
https://blog.csdn.net/elijahqi/article/details/80261967
那么我们每次只需要记录下来这个数取反的这个数可以是我们当前这个数如果每次都去更新它的子集 显然复杂度是无法接受的 那么先记录下来,相当于给所以先都打标记,最后一起下放
bzoj 4383 [POI2015]Pustynia
https://blog.csdn.net/elijahqi/article/details/80201077
线段树优化建图 拓扑序逆序dp
bzoj 3864 Hero meet devil 动态动态规划
www.elijahqi.win/archives/3265
首先预处理出lcs数组 然后将lcs数组因为每一个位置最多只会相差1所以
可以二进制压位 然后转移的时候枚举Lcs数组的状态 枚举后面添加的是哪一个字母然后转移即可
luogu3627&bzoj4990 [USACO17FEB]Why Did the Cow Cross the Road II P
https://blog.csdn.net/elijahqi/article/details/80399895
树状数组维护i-1位置的时候的dp值 然后分层转移 用树状数组维护那个我可以指向点之前的所有dp值的最大值
codeforces 678E Another Sith Tournament
https://blog.csdn.net/elijahqi/article/details/80344706
dp[s][j]表示在s状态下 并且擂主是j的最大比率是多少 边界条件 :当只有擂主一个人并且擂主是自己的概率为1 然后开始dp 擂主是j有可能是顺延上来也有肯能是被其他人打下去 不过不妨碍 它在下一层是擂主 这个必须倒着做 要不然状态不齐
codeforces 482c Game with Strings
https://blog.csdn.net/elijahqi/article/details/80344708
bzoj1560 [JSOI2009]火星藏宝图
https://blog.csdn.net/elijahqi/article/details/80344715
根据欧几里得距离公式还有均值不等式可以知道 (均值是瞎说的
(x+y)2>=x2+y2 ( x + y ) 2 >= x 2 + y 2
luogu2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
https://blog.csdn.net/elijahqi/article/details/80358599
codeforces 487B Strip
https://blog.csdn.net/elijahqi/article/details/80358635
单调队列维护区间最大值即可
bzoj 2216 [POI2011] Lightning Conductor
可以发现sqrt是一个增量单调递减的函数绝对值我们可以拆开两边各做一遍
bzoj 4197 [Noi2015]寿司晚宴
https://blog.csdn.net/elijahqi/article/details/80806528
所以我们把这八个记录下来 然后剩下的因为每次只会出现一次单独统计即可
考虑设dp[s1][s2]表示 在现在的所有状态中第一个人 选了8个质因数中s1状态 第二个人选了s2状态 我的方案数是多少
NOI2018 模拟 T2
https://blog.csdn.net/elijahqi/article/details/80836186
a[i]a[i1] ∑ a [ i ] − a [ i − 1 ] 最大 a[i]a[i1] a [ i ] − a [ i − 1 ] 表示两个点 树上距离
设dp[i][0/1/2]表示i为根子树内 有直径的几个点 然后转移的时候枚举下状态即可
bzoj4944 【NOI2017】泳池
https://blog.csdn.net/elijahqi/article/details/80889909
bzoj 3622 已经没有什么好害怕的了
https://blog.csdn.net/elijahqi/article/details/80780139
排序 然后尝试转移
dp[i][j] d p [ i ] [ j ] 表示前i个糖果有j个比药片大的方案数
dp[i][j]=dp[i1][j]+dp[i1][j1]max(0,i(j1)) d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − 1 ] ∗ m a x ( 0 , i − ( j − 1 ) )
codeforces 999F Cards and Joy
https://blog.csdn.net/elijahqi/article/details/80772321
对于每种卡牌算出 给出人数给出牌数 获得的喜悦值最大是多少
然后贪心取dp值即可
bzoj5311&codeforces 321E 贞鱼
https://blog.csdn.net/elijahqi/article/details/80759000
决策单调性加wqs二分 因为我们知道在wqs二分的时候有可能不是二分到整数的位置才是正确的 这时候我们应该钦定一下究竟每次是贪心取大还是小来确定切点的位置
bzoj 4712 洪水
https://blog.csdn.net/elijahqi/article/details/80740026
静态dp 要么选自己要么全选子树 那么动态dp的时候发现我们修改这个点的值的时候我们往上传递过程中 会对一些值产生改变 然后看这个改变量 轻重链剖分一下即可
codeforces 992 C Nastya and a Wardrobe
https://blog.csdn.net/elijahqi/article/details/80728054
直接矩阵倍增
bzoj 1187 [HNOI2007]神奇游乐园
https://blog.csdn.net/elijahqi/article/details/80716844
不要求覆盖整张图所以无论什么时候都可以终止状态
bzoj 3687 简单题
https://blog.csdn.net/elijahqi/article/details/80715156
bitset的应用
hdu 1693 Eat the Trees
https://blog.csdn.net/elijahqi/article/details/80714646
轮廓线状压dp一下
bzoj 4145 [AMPPZ2014]The Prices
https://blog.csdn.net/elijahqi/article/details/80712360
设dp[i][s]表示前i个商店购买s状态商品的最小代价转移的时候背包转移即可
bzoj 3573 [Hnoi2014]米特运输
https://blog.csdn.net/elijahqi/article/details/80710465
用log 将乘法变成加法保证精度
bzoj 5073 [Lydsy1710月赛]小A的咒语
https://blog.csdn.net/elijahqi/article/details/80707485
考虑设dp[i][j]表示当前在a中第i个位置用了j段在b中匹配的最大是多少
bzoj4321 queue2
https://blog.csdn.net/elijahqi/article/details/80700425
设dp[i][j][0/1]分别表示 已经插入1~i的排列 有j个数相邻 0,1分别表示最后i,i-1是否相邻
AGC 008E Next or Nextnext
https://blog.csdn.net/elijahqi/article/details/80699859
看原来的题解https://atcoder.jp/img/agc008/editorial.pdf
bzoj 3717 [PA2014]Pakowanie
https://blog.csdn.net/elijahqi/article/details/80699232
统计选几个包 可以设dp[s],dp1[s]分别表示装下这个物品需要多少个背包 背包用量最少是多少 将背包从大到小排序! dp时候排序很重要
bzoj 2164 采矿
https://blog.csdn.net/elijahqi/article/details/80691307
用树链剖分维护dp 复杂度吓人 合并信息参照朴素dp合并
bzoj 4557 [JLoi2016]侦察守卫
https://blog.csdn.net/elijahqi/article/details/80690092
f[x][i]表示 x的子树 由外部覆盖了x子树的前i层的最小代价 x为第一层
g[x][i]表示x节点的子树完全被覆盖x是第0层现在可以额外覆盖子树以外i层的东西
bzoj 3679 数字之积
https://blog.csdn.net/elijahqi/article/details/80687337
dp[i][j]表示 位数为i 凑出第j种数字的方案数
然后数位dp一下求 数字<=R的种类数
codeforces 894e Ralph and Mushrooms
https://blog.csdn.net/elijahqi/article/details/80686912
拓扑序缩点 然后环的答案 i=1ni(i+1)2=n×(n+1)×(n+2)6 ∑ i = 1 n i ∗ ( i + 1 ) 2 = n × ( n + 1 ) × ( n + 2 ) 6
codeforces 507E Breaking Good
https://blog.csdn.net/elijahqi/article/details/80686898
性质 然后dij的时候记录一下即可 因为dij是一个可以dp的过程
bzoj 3594 [Scoi2014]方伯伯的玉米田
https://blog.csdn.net/elijahqi/article/details/80677274
发现性质 一定是拔高最右边的一段区间那么用二维树状数组维护 高度<=h[i]+j且拔高次数<=j 的最大值即可然后每次二维区域选最大更新
bzoj2830 随机树
https://blog.csdn.net/elijahqi/article/details/80671423
i=1i<=xp[i] ∑ i = 1 i <= x p [ i ]
随机变量x的期望相当于所有小于等于x的概率相加

bzoj 4033 [HAOI2015]树上染色
https://blog.csdn.net/elijahqi/article/details/80666742
设dp[x][i]表示在x子树内选择了i个黑点 对答案做出的贡献最大是多少然后针对每条边算贡献即可
bzoj 4753 [Jsoi2016]最佳团体
https://blog.csdn.net/elijahqi/article/details/80664616
设dp[i][j]表示i子树选了j个点的最大代价 依赖形 背包
bzoj 5290 [Hnoi2018]道路
https://blog.csdn.net/elijahqi/article/details/80657510
x子树内有a,b个 道路的方案的最小花费 直接记忆化搜索即可
bzoj 4872 [Shoi2017]分手是祝愿
https://blog.csdn.net/elijahqi/article/details/80651367
https://www.cnblogs.com/zhoushuyu/p/8424095.html
这个题解real不错
loj2587「APIO2018」铁人两项
https://blog.csdn.net/elijahqi/article/details/80651331
变成圆方树之后枚举中间点 然后看他对两个圆点的贡献是多少
hdu4035 Maze
https://blog.csdn.net/elijahqi/article/details/80639826
=kiE[1]+(1kiei)/mE[fa]+(1kiei) 叶 子 节 点 = k i ∗ E [ 1 ] + ( 1 − k i − e i ) / m ∗ E [ f a ] + ( 1 − k i − e i )
=kiE[1]+(1kiei)/mE[fa]+yson[x](1kiei)/mE[y]+(1kiei) 非 叶 子 节 点 = k i ∗ E [ 1 ] + ( 1 − k i − e i ) / m ∗ E [ f a ] + ∑ y ∈ s o n [ x ] ( 1 − k i − e i ) / m ∗ E [ y ] + ( 1 − k i − e i )
E[i]表示在结点i处,要走出迷宫所要走的边数的期望。E1即为所求。
bzoj 5314 [Jsoi2018]潜入行动
https://blog.csdn.net/elijahqi/article/details/80637775
dp[x][i][0/1][0/1] d p [ x ] [ i ] [ 0 / 1 ] [ 0 / 1 ] 表示 现在处于x节点已经放置i个监听 当前位置是否被监听 以及当前位置是否被子树监听
bzoj 2933 [Poi1999]地图
https://blog.csdn.net/elijahqi/article/details/80613788
dp[i][j]表示前i个分成j块的最小代价
预处理trick pre[i][j]表示i~j分一块的代价
bzoj5369&loj6433 [Pkusc2018]最大前缀和
https://blog.csdn.net/elijahqi/article/details/80621653
g[s]表示选了s状态的数 使得任意前缀和都<=0
预处理sum[s]表示s状态的数字全选的和是多少
dp[s]考虑枚举一个后缀s1 使得sum[s1]>0那么无论在s1前面的是什么样的前缀 一定加上s1之后会选全部的s的点
bzoj4767 两双手
https://blog.csdn.net/elijahqi/article/details/80609411
那么就把这个几步当做 向量来看即可 这就变成了 每次只能往上往右走的dp套路题 然后就用做过的点和没做过点的来容斥即可
bzoj3782&luogu4478 [BJWC2018]上学路线
https://blog.csdn.net/elijahqi/article/details/80607447
同上一道题但是模数不是质数所以需要分解一下质因数然后crt合并一下即可

xc1(modm1)xc2(modm2)xc3(modm3)...xck(modmk) x ≡ c 1 ( mod m 1 ) x ≡ c 2 ( mod m 2 ) x ≡ c 3 ( mod m 3 ) . . . x ≡ c k ( mod m k )

CRT:c[i]×(M/m[i])inv(M/m[i],m[i])%M C R T : c [ i ] × ( M / m [ i ] ) ∗ i n v ( M / m [ i ] , m [ i ] ) % M
loj 2540「PKUWC 2018」随机算法
https://blog.csdn.net/elijahqi/article/details/80551879
设dp[i][s]表示s状态的集合一定不能选 i表示这种状态的最大独立集大小可以这么想 选了这个不在集合内的点他会贡献和他相邻的点不能选 那么这些贡献出来的点体现在原序列中怎么选就需要应用排列的公式去计算一下即可
bzoj 5287 [Hnoi2018]毒瘤
https://blog.csdn.net/elijahqi/article/details/80532865
枚举每个多于点的状态然后虚树dp即可

数学和思维题

莫比乌斯

狄利克雷函数(f*g)(n)= d|nf(d)×g(nd) ∑ d | n f ( d ) × g ( n d )
id(x) i d ( x ) 为常函数
关于 φ μ φ   μ 等函数的四大结论
φ×1=id φ × 1 = i d
μ×id=φ μ × i d = φ
μ×1=ε μ × 1 = ε
ε×1=1 ε × 1 = 1
已知存在 g=f×1 g = f × 1 也存在 f=g×μ f = g × μ
证明:简略
d|nμ(d)d|ndf(d) ∑ d | n μ ( d ) ∑ d ′ | n d f ( d ′ ) 先带入
然后套路发现只有d’==1的时候才有值 于是成立
一些常见技巧:
d|gcd(x,y) d | g c d ( x , y ) = d|x,d|y d | x , d | y
见到无关变量尽量直接化简 如果发现
[gcd(i,j)==1] [ g c d ( i , j ) == 1 ] 可以变成 d|nμ(d)×1=ε ∑ d | n μ ( d ) × 1 = ε
面对例如 d|i,d|j d | i , d | j 这样的形式可以尝试提前枚举d(应该普遍套路?
栗子:原式: mj=1[gcd(j,k)==1]ni=1d|i,d|jμ(d) ∑ j = 1 m [ g c d ( j , k ) == 1 ] ∑ i = 1 n ∑ d | i , d | j μ ( d )
提前枚举d: nd=1μ(d)nd|imd|j[gcd(j,k)==1] ∑ d = 1 n μ ( d ) ∑ d | i n ∑ d | j m [ g c d ( j , k ) == 1 ]
此外:若统计 i=1ngcd(i,k)==1 ∑ i = 1 n g c d ( i , k ) == 1
这时候我们发现如果这个k比较小的时候我们可以
算出k以内所有的东西 然后因为我们发现若gcd(a,k)=1 那么gcd(a+xk,k)=1
所以我们剩下的翻倍处理下即可 然后%k剩余的那些东西再暴力算即可
例如 i=1nμ(i×d) ∑ i = 1 n μ ( i × d )
考虑到 μ μ 函数的特殊性 我们直接拆开是没有问题的 因为当gcd(i,d)!=1的时候原函数=0不会产生什么影响
那么我们直接当gcd(i,d)=1这样积性函数拆开即可
一般是枚举gcd,然后判[gcd==d]的时候才累加,
然后除掉一个d变成[gcd==1],然后套式子
i=1nj=1mgcd(i,j)==1 ∑ i = 1 n ∑ j = 1 m g c d ( i , j ) == 1
考虑把后面的条件换成 ε ε 然后狄利克雷卷积
d|(i,j)μ(d) ∑ d | ( i , j ) μ ( d ) 变成枚举d 然后因为是 (i,j) ∑ ( i , j ) 然后在这里再有一个d
所以可以考虑直接枚举d 然后数论分块即可
【bzoj2301&&luogu2522】[HAOI2011]Problem b
https://blog.csdn.net/elijahqi/article/details/79350251
这里有抄的公式http://www.elijahqi.win/archives/92
bzoj1101&&luogu3455】[POI2007]Zap
https://blog.csdn.net/elijahqi/article/details/79350268

杜教筛

(划分到莫比乌斯里面)
(fg)(n)=h ( f ∗ g ) ( n ) = h 积性函数前缀和
考虑我们要求积性函数 f(x) f ( x ) 的前缀和 需要另外找一个积性函数 g(x) g ( x )
将他俩卷起来 然后 求新函数的前缀和
得到式子 i=1nd|ig(d)×f(id) ∑ i = 1 n ∑ d | i g ( d ) × f ( i d )
d=1ng(d)d|if(id) ∑ d = 1 n g ( d ) ∑ d | i f ( i d )
d=1ng(d)i=1ndf(i) ∑ d = 1 n g ( d ) ∑ i = 1 n d f ( i )
然后发现后面这部分就是我们想求的前缀和只不过是到 nd n d

BJ 集训测试6 求和
https://blog.csdn.net/elijahqi/article/details/79610235
枚举gcd 然后替换 发现前半部分求 φ φ 的前缀和 n=1e9 杜教筛搞之
学到的套路:尽量将 μ μ 提前 如果有两个变量 看是否可以合并枚举

xtx学长课件的大boss 循环之美!

其他

AtCoder Regular Contest 068-D
https://blog.csdn.net/elijahqi/article/details/78872720

高斯消元

bzoj1013 [JSOI2008]球形空间产生器sphere
设球心x,y 然后列方程 使得所有点到球心距离相同
https://blog.csdn.net/elijahqi/article/details/78880867
luogu3389 【模板】高斯消元法
高斯消元板子
https://blog.csdn.net/elijahqi/article/details/78880886

网络流

bzoj1001 [BeiJing2006]狼抓兔子
https://blog.csdn.net/elijahqi/article/details/78847373
一个显然的做法直接从左上角到右下角建边网络流
正规做法:平面图转对偶图 每个网格建点然后最外面分成两个点 从起点到终点跑最短路
poj2396 budget
https://blog.csdn.net/elijahqi/article/details/78849041
有源汇判断可行流的一题 汇点向源点连inf边判断最大流是否满流
建图提醒:度> 0源点向其连边
loj117 有源汇上下界最小流
可爱的板子
https://blog.csdn.net/elijahqi/article/details/78858700
先无t-> s的边 再加上跑看t-> s反向边即可
bzoj2502 清理雪道
https://blog.csdn.net/elijahqi/article/details/78859830
存在拓扑关系建图最小流
bzoj4200 [NOI2015]小园丁与老司机
https://blog.csdn.net/elijahqi/article/details/78872038
会被hack至今也没有改对
层之间进行dp转移 同层也可以转移左边dp值+左边能许愿的树最大的这个值 或者 右边dp值+右边所有的许愿树的最大值
loj116 有源汇有上下界最大流
https://blog.csdn.net/elijahqi/article/details/78872047
先判断是否可行 然后在原图s->t上直接最大流
poj1149 PIGS
https://blog.csdn.net/elijahqi/article/details/78872247
所以建图的方法就是我如果这个猪圈第一次 有人买他 就把他向那个人建容量为猪圈数的边 然后如果这个人想买的这个猪圈之前有人 买了 那么则从之前那个人向我建边 容量inf
bzoj3876 [Ahoi2014&Jsoi2014]支线剧情
https://blog.csdn.net/elijahqi/article/details/78873474
满足下界的基础上 跑最小费用流即可
bzoj3698 XWW的难题
https://blog.csdn.net/elijahqi/article/details/78876796
上下界最大流
bzoj2055 80人环游世界
https://blog.csdn.net/elijahqi/article/details/78877885
上下界最小费用流
bzoj4213 贪吃蛇
https://blog.csdn.net/elijahqi/article/details/78878860
保证点度数为2 如果存在度数为1的点 说明是需要花费费用被用来计数的 添加带费用的边即可
poj2195 Going Home
裸题
https://blog.csdn.net/elijahqi/article/details/78879149
hdu4292 food
人在中间 左右两边放食物和饮料
https://blog.csdn.net/elijahqi/article/details/78879312
poj1698 Alice’s Chance
类似分层图 一周拆7天 然后做
https://blog.csdn.net/elijahqi/article/details/78884657
codeforces 512C Fox And Dinner
偶数+奇数才能构成质数 发现一定是偶环于是二分图做即可
https://blog.csdn.net/elijahqi/article/details/78884679
codeforces 546e Soldier and Traveling
每个城市拆点
https://blog.csdn.net/elijahqi/article/details/78884702
codeforces 589F Gourmet and Banquet
https://blog.csdn.net/elijahqi/article/details/78886775
二分有多少时间给每个人去吃菜 然后左开右闭区间
最大流看是否满流
poj2516 Minimum Costhttps://blog.csdn.net/elijahqi/article/details/78888884
物品独立 分别费用流
poj 2455 Secret Milking Machine
https://blog.csdn.net/elijahqi/article/details/78888984
二分路径最大值 网络流验证
bzoj1497 [NOI2006]最大获利
https://blog.csdn.net/elijahqi/article/details/78889554
最大权闭合子图 提示:正边权-最小割
bzoj1391 [Ceoi2008]order
https://blog.csdn.net/elijahqi/article/details/78890788
增加任务向仪器连租金的边
bzoj1412 [ZJOI2009]狼和羊的故事
https://blog.csdn.net/elijahqi/article/details/78891510
格子之间容量1边 源向狼无限 羊向汇无限最小割即可
bzoj1934 [Shoi2007]Vote 善意的投票
https://blog.csdn.net/elijahqi/article/details/78892468
朋友连接在中间 左右两边分别是睡觉和不睡觉
bzoj3275 Number
https://blog.csdn.net/elijahqi/article/details/78897217
分析a,b应该互相是偶数和奇数
带权值 则中间有infi表示两个必须选一个 求最小割 总和减即可
bzoj2127 happiness
https://blog.csdn.net/elijahqi/article/details/78895155
毒瘤 看题解
bzoj2132 圈地计划
https://blog.csdn.net/elijahqi/article/details/78894025
黑白染色 一边分别连工业商业两种边中间连共同的奖励
hdu3549 dinic&sap
https://blog.csdn.net/elijahqi/article/details/78916533
poj1273 Drainage Ditches
https://blog.csdn.net/elijahqi/article/details/78916511板子
bzoj3396 [Usaco2009 Jan]Total flow 水流
https://blog.csdn.net/elijahqi/article/details/78910520
大小写字母并存
bzoj3504 [Cqoi2014]危桥
https://blog.csdn.net/elijahqi/article/details/78908149
交换s1,t1的起点再跑一次验证
bzoj1532 [POI2005]Kos-Dicing
https://blog.csdn.net/elijahqi/article/details/78902131
二分每个人最多赢的比赛次数 然后把这个容量建边 网络流判断怎么分配比赛使得每个比赛至少有一个人赢得比赛
bzoj2661 [BeiJing wc2012]连连看
https://blog.csdn.net/elijahqi/article/details/78906852
只有区间在这个n范围内可做
已知 x2y2=z2 x 2 − y 2 = z 2 且gcd(y,z)=1i时候 gcd(x,y)一定是1
每个数拆成两个点 边权值为i+j最大费用最大流然后/2
bzoj3280 小R的烦恼
https://blog.csdn.net/elijahqi/article/details/78898197
1~n表示我这次有多少个人濒临死亡 然后n+1~2*n表示 这次我需要多少个研究生
bzoj1930 [Shoi2003]pacman 吃豆豆
https://blog.csdn.net/elijahqi/article/details/78899836
似乎是一道错题?学的题解
求两条不相交上升子序列 按照x,y分别一二关键字排序
拆点变成费用1和0的边
bzoj1061 [Noi2008]志愿者招募
https://blog.csdn.net/elijahqi/article/details/78906796神题
列出方程 然后变成所有变量均在两个等式中出现
然后且一正一负 那么根据网络流每个点流量守恒即可得出结果
最小费用最大流即可
luogu1402 酒店之王
https://blog.csdn.net/elijahqi/article/details/78916556
分为房间 人 菜 三类点连接即可
bzoj2561 最小生成树
https://blog.csdn.net/elijahqi/article/details/78919769
最小删除几条即最小割 可以把小于i的边都加入 大于i的边都加入求最小割
bzoj4514 [Sdoi2016]数字配对
https://blog.csdn.net/elijahqi/article/details/78923046
按照i质因数中质数个数安排 建立二分图 按照费用流单调性如果出现负数break
bzoj1324 Exca王者之剑
https://blog.csdn.net/elijahqi/article/details/78926120
只有偶数的时候 可以取到点
那么两行两行分别求点权最大独立集 互相并不会影响
这个是一个构造性的解 具体证明 参见论文
luogu2153 [SDOI2009]晨跑
https://blog.csdn.net/elijahqi/article/details/78927058
拆点限制容量 起点终点格外注意 最小费用最大流模板
luogu3153&&bzoj1305 [CQOI2009]DANCE跳舞
https://blog.csdn.net/elijahqi/article/details/78927039
每个人拆点变成喜欢和不喜欢 两个人喜欢相互喜欢连边 反之连不喜欢
luogu2472&&bzoj1066 [SCOI2007]蜥蜴
https://blog.csdn.net/elijahqi/article/details/78927025
每个柱子拆点 限制跳跃次数
poj 2125 Destroying The Graph
https://blog.csdn.net/elijahqi/article/details/78927006
边看成点 出边 入边变成二分图 此题转化为最小点权覆盖集
luogu3191 [HNOI2007]紧急疏散EVACUATE
https://blog.csdn.net/elijahqi/article/details/78927082
宽搜最短路二分答案连边 注意门也需要拆点
hdu4160 Dolls
https://blog.csdn.net/elijahqi/article/details/78938794
最小路径覆盖问题 总点数-最大匹配
luogu3877 [TJOI2010]打扫房间
https://blog.csdn.net/elijahqi/article/details/78939545
黑白染色 二分图 环每个点度都是2 建图 分别限制2 看能否满流
luogu3872 [TJOI2010]电影迷
https://blog.csdn.net/elijahqi/article/details/78949456
最大权闭合子图 正左 负右 有关联互相连即可
bzoj1520 [POI2006]Szk-Schools
https://blog.csdn.net/elijahqi/article/details/78952154
费用流板子
bzoj2324 [ZJOI2011]营救皮卡丘
https://blog.csdn.net/elijahqi/article/details/78956055
求出每个点到比他大的点的最短路且不经过比自己大的点
然后每个点拆点限制流量最小费用最大流即可
bzoj1449 [JSOI2009]球队收益
https://blog.csdn.net/elijahqi/article/details/78957049
先把负的收益强行加上 然后为每个比赛新建节点每个比赛连相应的人
费用为他胜利的费用 最小费用流即可
bzoj2895 球队预算
https://blog.csdn.net/elijahqi/article/details/78957071双倍经验同上
bzoj2929 [Poi1999]洞穴攀行
https://blog.csdn.net/elijahqi/article/details/78957233
拆点最大流
bzoj1565 [NOI2009]植物大战僵尸
https://blog.csdn.net/elijahqi/article/details/78964577
满足约束关系 拓扑去环 被保护的点向保护他的点连边 然后根据最大权闭合子图建图
bzoj 1822 [JSOI2010]Frozen Nova 冷冻波
https://blog.csdn.net/elijahqi/article/details/78970321
二分时间 然后建图用时间/冷却时间限制流量 判断是否与线段相交可以简单 先求到端点最长边
然后求到直线的距离 然后比较线段长度 和另外一条直角边长度的差距即可
bzoj2893 征服王
https://blog.csdn.net/elijahqi/article/details/78990393
floyd跑不动 每个点拆开上下界最小流即可 注意tarjan缩点
bzoj3158 千钧一发
https://blog.csdn.net/elijahqi/article/details/78991156
奇数都满足1 偶数都满足2
奇数偶数放在两边中间连inf 最小点权覆盖问题? 有冲突的点之间连inf边
bzoj1143 [CTSC2008]祭祀river
https://blog.csdn.net/elijahqi/article/details/78996819
这题求的是最长反链 然后通过定理可以转化为最小可相交路径覆盖数(证明:不会 tjoi2015,noip导弹拦截也用了此定理
zoj 2760 How Many Shortest Path
https://blog.csdn.net/elijahqi/article/details/79003072
最大边不相交最短路数量 数据有坑点
先求最短路然后枚举验证是否在最短路上 限制每条边只能走一回 最大流出解
bzoj2756 [SCOI2012]奇怪的游戏
https://blog.csdn.net/elijahqi/article/details/79003244
被sc大佬吐槽的水题 黑白染色
格子奇数个可以 直接计算 因为黑白格必定增加相同 二分最后的答案是否满流验证即可
bzoj3894 文理分科
https://blog.csdn.net/elijahqi/article/details/79008728
一个人拆三个 一个是本身 一个是都选文p2 一个是都选理p1
源向我连选理的边 我向汇连选文的边
S向p1连 same理 p1向自己还有周围连inf
p2->T same 文 周围还有自己连向P2
codeforces 498C Array and Operations
https://blog.csdn.net/elijahqi/article/details/79012754
同除质因数除法次数最多
枚举每个质因数 针对所有数重新跑一遍
bzoj2400 Spoj 839 Optimal Marks
https://blog.csdn.net/elijahqi/article/details/79016972
二进制首先想到的就是拆位
黑科技 增大某些边的容量可以使得割偏向汇点
bzoj3931 [CQOI2015]网络吞吐量
https://blog.csdn.net/elijahqi/article/details/79019229
老套路 枚举边验证最短路拆点跑最大流即可
bzoj1163 [Baltic2008]Mafia
https://blog.csdn.net/elijahqi/article/details/79019277
拆点 裸题
bzoj3774 最优选择
https://blog.csdn.net/elijahqi/article/details/79022383
无法直接建二分图
考虑二分图染色 两边然后交换源和汇的意义
hdu5988 Coding Contest
https://blog.csdn.net/elijahqi/article/details/79024802
变乘法转log为加法 因为费用流存在负环所以利用概率的一些性质转为求相反的即可
bzoj1927 [Sdoi2010]星际竞速
https://blog.csdn.net/elijahqi/article/details/79026470
在找总结的时候总觉得在哪里见到过..
这个应该是一类问题 每个点拆成出点和入点 建二分图 中间连边就是最小权值最小路径覆盖问题
但是对于跳跃过去的点我们可以考虑认为是从源点花费代价到达的即可
luogu3376 【模板】网络最大流
https://blog.csdn.net/elijahqi/article/details/79039477巩固
luogu3381 【模板】最小费用最大流
https://blog.csdn.net/elijahqi/article/details/79039484巩固
bzoj1711&luogu2891 [Usaco2007 Open]Dining吃饭
https://blog.csdn.net/elijahqi/article/details/79039864
poj上类似题 人在中间
bzoj1458 士兵占领
https://blog.csdn.net/elijahqi/article/details/79047965
黑白染色变最少变成最多减少
SGU 194 Reactor Cooling
https://blog.csdn.net/elijahqi/article/details/79047986
上下界可行流
update:现在再来看这题当初的理解是有些问题的再来补充一下 这个题 因为每个点的流入流出都是守恒的所以我们可以看出如果下界中流入的比流出的多 那么说明一会儿我平衡的时候需要更多的自由流来满足这个点的平衡所以这个自由流我就从源点再连过来 汇点同理
bzoj3144&luogu3227[Hnoi2013]切糕
https://blog.csdn.net/elijahqi/article/details/79054402
最小割距离限制问题 从x向x-d连inf边
如果相邻两个元素的距离超过D,那么必然会由于inf边的存在而存在其他通路,
导致我们割掉权值更大的边
loj6005「网络流 24 题」最长递增子序列
https://blog.csdn.net/elijahqi/article/details/79054417
n*log 第一问
第二问 每个点拆开并且考虑dp本质 一个点是从前一个地方a[i]<=a[j]转移过来那么如果有我就直接连边
最后跑最大流验证
loj6008 &luogu1251 餐巾计划问题
https://blog.csdn.net/elijahqi/article/details/79054428
要用的点放在下面 然后用完的点放在上面 因为这些都固定所以剩下根据题目建图即可
T13656 NOI接站
https://blog.csdn.net/elijahqi/article/details/79054433
tarjan之后 最小可重路径覆盖问题
bzoj1221[HNOI2001] 软件开发
https://blog.csdn.net/elijahqi/article/details/79091255
同餐巾计划
bzoj2424&luogu2517 [HAOI2010]订货
https://blog.csdn.net/elijahqi/article/details/79091263
分时间建图每个点向自己后一个点连边
bzoj3171&luogu3965 [TJOI2013]循环格
https://blog.csdn.net/elijahqi/article/details/79091275
这种问题一般转化为度数相关 然后根据题目要求限制费用或者流量
bzoj2245 [SDOI2011]工作安排
https://blog.csdn.net/elijahqi/article/details/79091291
每个人工作的愤怒值是一个分段函数拆开即可 最后并不需要向物品建边 可以减少常数
loj6010「网络流 24 题」数字梯形
https://blog.csdn.net/elijahqi/article/details/79091296
拆点限制 边也限制
loj6011「网络流 24 题」运输问题
https://blog.csdn.net/elijahqi/article/details/79091299
最大费用流板子
loj6013「网络流 24 题」负载平衡
https://blog.csdn.net/elijahqi/article/details/79091311
算出每个点平均值 分 差的正负 左右分开 互相也需要inf边
bzoj3438 &luogu1361 小M的作物(最小割)
https://blog.csdn.net/elijahqi/article/details/79111850
仍然是文理分科经典模型
loj 6014「网络流 24 题」最长 k 可重区间集
https://blog.csdn.net/elijahqi/article/details/79117704
边权1 覆盖1次 费用区间长度 最大费用最大流
loj6015「网络流 24 题」星际转移
https://blog.csdn.net/elijahqi/article/details/79117708
按照题意 分时间分层建图 一开始并查集判断联通性
bzoj1834 [ZJOI2010]network 网络扩容
https://blog.csdn.net/elijahqi/article/details/79117711
第二问 在残余网络上 增加k容量 花费为w的边 然后跑一遍费用流求出答案即可
loj6012「网络流 24 题」分配问题
https://blog.csdn.net/elijahqi/article/details/79117717
和仓库那题基本没区别
loj6007「网络流 24 题」方格取数 最大点权独立集
https://blog.csdn.net/elijahqi/article/details/79117722
总价值-最小点权覆盖集
loj 6006「网络流 24 题」试题库
https://blog.csdn.net/elijahqi/article/details/79117730
最大流裸题
Loj 6001「网络流 24 题」太空飞行计划
https://blog.csdn.net/elijahqi/article/details/79117732
最大权闭合子图
loj6003「网络流 24 题」魔术球
https://blog.csdn.net/elijahqi/article/details/79117736
相当于最小路径覆盖问题
二分答案验证路径数
loj6004「网络流 24 题」圆桌聚餐
https://blog.csdn.net/elijahqi/article/details/79117969
团队->桌子->汇
loj 6002 「网络流 24 题」最小路径覆盖
https://blog.csdn.net/elijahqi/article/details/79124197巩固
poj2594Treasure Exploration
https://blog.csdn.net/elijahqi/article/details/79124206
最小可重路径覆盖问题
hdu3667 Transportation
https://blog.csdn.net/elijahqi/article/details/79124214
费用递增问题
如果对于某条边,其费用是关于流量的一个函数,并且满足他斜率是单调增加的,我们就可以拆边,第x条费用设为f(x)−f(x−1)
这样由于我们跑最小费用,每次就会找最小的,流了x时就能正好计算了对应的f(x)
poj2289 Jamie’s Contact Groups
https://blog.csdn.net/elijahqi/article/details/79124221
二分答案验证
loj6122「网络流 24 题」航空路线问题
https://blog.csdn.net/elijahqi/article/details/79124238
拆点 限制两条路径即可
loj6224「网络流 24 题」深海机器人问题
https://blog.csdn.net/elijahqi/article/details/79124253裸题
loj6225「网络流 24 题」火星探险问题
https://blog.csdn.net/elijahqi/article/details/79124268
每个点限制次数拆成两个点
loj6226「网络流 24 题」骑士共存问题
https://blog.csdn.net/elijahqi/article/details/79131977
二分图最大独立集等于n-最大流
loj6227 「网络流 24 题」最长k可重线段集问题
https://blog.csdn.net/elijahqi/article/details/79132000
同前面的最长k可重区间 离散化时候注意不能出现自环 将一个点拆成奇和偶即可
bzoj2007 [Noi2010]海拔
https://blog.csdn.net/elijahqi/article/details/79223668
一定都是0,1 然后平面图转对偶图
bzoj2668 [cqoi2012]交换棋子
https://blog.csdn.net/elijahqi/article/details/79319243
比较特殊 看题解吧..
bzoj3130 [Sdoi2013]费用流
https://blog.csdn.net/elijahqi/article/details/79331501
实数二分 实数网络流
bzoj1797 [Ahoi2009]Mincut 最小割
https://blog.csdn.net/elijahqi/article/details/79331516
先跑网络流 残余网络tarjan 如果两点属于不同的点 则可能是割边 如果分别属于S,T则一定是割边
bzoj3996 [TJOI2015]线性代数
https://blog.csdn.net/elijahqi/article/details/79354775
推导一下式子变成 选择每个物品需要花费一个代价 然后共同选两种物品 会得到一个好处 就是b矩阵 现在求最大收益 那就是最大权闭合子图
bzoj1433&&luogu2055】[ZJOI2009]假期的宿舍
https://blog.csdn.net/elijahqi/article/details/79533725
如果是在校学生则有床位,连接床位和汇点若认识或者自己有床位则和自己相连接
从源点向每个需要床的学生连接包括来访和不回家的
【luogu1402】 酒店之王 (福建省夏令营)
https://blog.csdn.net/elijahqi/article/details/79533735
因为每个人只能存在一回 将每个人拆开分成两个点限制流量为1就可以
分为房间 人 菜 三类点连接即可
【HDU3549】
https://blog.csdn.net/elijahqi/article/details/79533755
poj 1273
https://blog.csdn.net/elijahqi/article/details/79533767
BJ 集训测试9 draw
https://blog.csdn.net/elijahqi/article/details/79679788
欧拉图计数问题 发现如果不是1,-1这种边我改变反向都会对答案产生贡献
BJ 集训测试11 flow
https://blog.csdn.net/elijahqi/article/details/79700033
那么考虑一个割割开之后分成s,t集合那么如果会产生这种问题一定是集合t有连回s的边 那么会重复转圈走所以给每条边都添加inf的边 让这样的问题消失 然后跑最大流即可 不存在的话输出-1即可
BJ 集训测试14 bird
https://blog.csdn.net/elijahqi/article/details/79764138
模拟网络流
bzoj5251 [2018多省省队联测]劈配
https://blog.csdn.net/elijahqi/article/details/79890462
我可以二分到我所在的那个排名 然后把上一个人的残余网络拷过来 然后添加上我的这些边看能否跑得动 即能否通过调整满足我的志愿的要求即可得到答案
bzoj5154 [Tjoi2014]匹配
https://blog.csdn.net/elijahqi/article/details/79951489
先暴力网络流 然后枚举所有有流量的边看是否仍然可以匹配
bzoj3175 [Tjoi2013]攻击装置
https://blog.csdn.net/elijahqi/article/details/79992829
最大点独立集 总数-最大匹配
bzoj5037 [Jsoi2014]电信网络
https://blog.csdn.net/elijahqi/article/details/80041186
最大权闭合子图
bzoj4873 [Shoi2017]寿司餐厅
https://blog.csdn.net/elijahqi/article/details/80045047
最大权闭合子图 注意m是常量 然后即可做
bzoj 4276 [ONTAK2015]Bajtman i Okrągły Robin
https://blog.csdn.net/elijahqi/article/details/80112381
优化建图暴力费用流即可
codeforces 976 F Minimal k-covering
https://blog.csdn.net/elijahqi/article/details/80177613
要使每个点的度数大于等于k,可使流过每个点的流量小于等于d[i]-k
bzoj3218 a + b Problem
https://blog.csdn.net/elijahqi/article/details/80200705
主席树优化建图 最小割即可
bzoj 3681 Arietta
https://blog.csdn.net/elijahqi/article/details/80280088
进行轻重链的划分 然后每个节点直接从子树重儿子继承过来 然后其他轻儿子就用启发式合并即可 可以证明这个复杂度是log^2的 即 点数 n*log(n)^2+n+m 边数 2*n*log(n)^2+m*log(n) 主席树合并
bzoj 3258 秘密任务
https://blog.csdn.net/elijahqi/article/details/80684992
所以就直接新建一个点 然后两端权值分别建成两条边即可
最后在残余网络上跑tarjan 确定找出那些是割边但不一定是割边的边 然后判断是否唯一解

一般图最大匹配

UOJ171&bzoj4405 【WC2016】挑战NPC
https://blog.csdn.net/elijahqi/article/details/79191161
正解:带花树+思路
首先把每个筐拆成三个点 然后给其中的两个点连上边 然后我 这个物品分别向他给出的条件的那三个点都连一下 可以yy一下 三个点都连起来和只给两条边连起来的效果是一样的因为我只需要满足这样一种关系即可 即:如果没有球向他连,自己匹配贡献1 如果有球向他连接 球的匹配+自己匹配-球*1 正好也满足条件 (这时候如果是三条边就比较好想 然后 再往上依此类推即可
最后输出的时候方案数就是匹配数-n
uoj还要输出方案数这时候就需要注意一些了 我必须要首先去匹配物品和框之间的边 然后再匹配框内互相匹配的情况 否则输出方案不对
uoj 79 一般图最大匹配 苏凯树
https://blog.csdn.net/elijahqi/article/details/80147027 乱搞

欧拉图

欧拉图判定条件
有向图:联通 且每个点入度等于出度
无向图:联通 且每个点度数都是偶数
让我想起之前 欧拉回路计数问题
考虑无向图欧拉回路问题 一定是点度数为奇数的会增加一条路径 注意成环的情况需要将最后答案与1取max 有向图欧拉回路计数 是直接用所有入度比出度多的差/2即可 证明可以考虑上下界网络流
poj1637 Sightseeing tour
https://blog.csdn.net/elijahqi/article/details/79004539
考虑首先随机定向然后判断度为负的源向他连 正他向汇连接 所有度需要/2每条被钦定的边权值1 表示可以反向一次
bzoj2095 [Poi2010]Bridges
https://blog.csdn.net/elijahqi/article/details/79005328
二分答案 然后同上题判断是否存在欧拉回路
欧拉路模板题目(uoj117)
https://blog.csdn.net/elijahqi/article/details/80787046

后缀自动机 SAM

部分内容来自
https://blog.csdn.net/werkeytom_ftd/article/details/50545049

什么是SAM SAM就是后缀自动机,它满足以下性质:
1、从根节点沿着边走到达任意一个结点走出的字符串都是原文本串的一个子串,而且两种不同的走法走出来的字符串一定不相同。
2、一个结点可以接受新后缀的意思是从根节点走到这个结点所得出的所有字符串,均为原文本串的后缀。 (终止节点)
3、pre数组可以看做fail指针。并满足如果p可以接受新后缀,pre[p]也可以接受新后缀。
下面还将用到step数组,表示从根节点走到一个点的最长路长度。
那么对于文本串S,我们一个字符一个字符的添加进后缀自动机就能得到S的自动机。其思想为已知字符串t的后缀自动机,往t的SAM加入新的后缀x可以得到tx的SAM。
我们考虑如何加入一个新后缀x。
首先,新建一个点np来表示新后缀。找到可以接受后缀的最后一个结点last,那么令p=last,不断令p沿着pre跳。由于性质3,所有p的x儿子为空的结点均可往np连边。但如果跳到一个p,p已经有了x儿子为q,该怎么办?
情况1:step[q]=step[p]+1,证明经过q一定得经过p,且是由p直接到q。这个时候假设把q看做np,那么走到p后沿着x边走到q就相当于走到p后沿x走到np。那么由于把q当作了np,所以原本从p走到np组成的字符串等价于从p走到了q,那么既然前者是文本串的后缀,后者也是文本串的后缀。因此q可以接受新后缀。pre[np]=q。
情况2:step[q]>step[p]+1,这时候不能沿用情况1的做法,因为从p走到q是文本串的后缀不能代表走其他路到q也是文本串的后缀。此时的q不一定能够接受新后缀。(情况1走到q一定得经过p,而情况2不能保证)。我们可以仿照情况1,即造出一个nq当作q的替代点,复制q所有信息,然后令step[nq]=step[p]+1,那就变成情况1了,pre[np]=nq。根据性质3,因为可以从p到nq(到达nq必经p),而从p也能到达q,所以从根节点走到q的路线包含了从根节点走到nq的路线,因此若q可以接受新后缀nq一定可以。pre[q]=nq。
这就是构造了。复杂度是o(n)的。

关于后缀的有限状态自动机 即可以识别所有后缀的有向无环图 定义right集合表示每个子串在原串中出现的位置
后缀自动机上每个节点是right集合相同的子串的一个集合 len 表示这个节点从初始状态转移过来最长需要多少次 同时也意味着 这个节点代表的最长串的长度
此外根据yy 也许有些结论是错误的 即 所有叶子的size为1 且他们一定长度对应一个前缀区间
然后就是一些性质的总结
针对每个节点用它减去fa的len得到的就是 不同的串的个数
一个串的子串有多少之类的问题,或是询问子串/后缀的问题,就用子边转移(自动机性质)。
而计算一个串重复出现次数(right集合的问题),回退到最长匹配状态(LCS问题),就用父边转移(后缀树性质)。
bzoj2946 [Poi2000]公共串
https://blog.csdn.net/elijahqi/article/details/79778043
求多个串的最长公共子串
挑一个出来建SAM 设mx[x]表示所有串在这个节点匹配的长度 tmp[x]表示当前串和第一个串在该节点匹配的长度是多少 匹配之后注意用拓扑序列完整更新 如果匹配到我这个点 那么既然可以匹配到我 那么我的父节点当前匹配一定就是父节点的长度
SPOJ 1812 LCS2 - Longest Common Substring II
https://blog.csdn.net/elijahqi/article/details/79778065同上
bzoj2555 SubString
https://blog.csdn.net/elijahqi/article/details/79780015
在当前字符串后面加入一个字符串 (在线构造
动态询问right集合大小 操作lct维护子树的链加
注意splay懒标记如何打
bzoj4892 [Tjoi2017]dna
https://blog.csdn.net/elijahqi/article/details/79836711
建立sam然后直接dfs 如果长度匹配到了 就加上这个点的长度
bzoj3926 [Zjoi2015]诸神眷顾的幻想乡
https://blog.csdn.net/elijahqi/article/details/79782203广义后缀自动机
叶子只有20个 枚举每一个生成的答案即为所求 如何dfs一棵树我们可以考虑每次在dfs的时候我都可以把上次插入的地方记录下来 然后继续dfs即可
建立出广义后缀自动机之后 每次max[x]-min[x]即是答案
bzoj4516 [Sdoi2016]生成魔咒
https://blog.csdn.net/elijahqi/article/details/79874920 利用上面总结的性质:每个节点对应若干个子串,所有节点代表的所有子串本质不同,节点i代表的子串个数为最长的长度减去par树上最长的长度
luogu3804 【模板】后缀自动机
https://blog.csdn.net/elijahqi/article/details/79874937
拓扑时候统计答案
BJ 集训测试2 Problem B 朋友
https://blog.csdn.net/elijahqi/article/details/79859914
用最少的人数覆盖广义自动机 在自动机上跑最小流即可
似乎同该T1 https://www.cnblogs.com/Cmd2001/p/8698088.html
bzoj3998 [TJOI2015]弦论
https://blog.csdn.net/elijahqi/article/details/79874948
求第K小子串 建出SAM 求出每个节点底下管辖了多少子串 然后26分(雾
注意T=0的情况需要保证有重复出现的算一个
bzoj2882 工艺
https://blog.csdn.net/elijahqi/article/details/79874958
复制一遍然后dfs求字典序最小即可
spoj8222 NSUBSTR - Substrings
https://blog.csdn.net/elijahqi/article/details/79874985
拓扑排序在每个节点把最长的那个取出来 放到dp数组 然后从大到小彻底更新一遍
spoj7258 SUBLEX Lexicographical Substring Search
https://blog.csdn.net/elijahqi/article/details/79874993
同tjoi弦论
bzoj4566 [Haoi2016]找相同字符
https://blog.csdn.net/elijahqi/article/details/79906912
首先针对一个串建SAM 然后用另一个串在sam上跑 首先算出这个端点结束的唯一的后缀的个数
然后剩下的所表示的就是会和父节点多次出现的东西 所以我们考虑首先先把他们的系数算出来 拓扑排序处理一下
最后再在拓扑排序的时候每个节点*(len[x]-len[fa[x]])
bzoj2806 [Ctsc2012]Cheat
https://blog.csdn.net/elijahqi/article/details/80034447
二分答案+单调队列优化dp 设dp[i]表示长度不小于l最大匹配长度
注意插入单调栈的时候需要将i-mid这些位置的东西插入才可以 否则有问题
bzoj 2780 [Spoj]8093 Sevenk Love Oimaster
https://blog.csdn.net/elijahqi/article/details/80064066
广义sam+树状数组
建好sam之后将询问结束位置离线按照par树dfs序处理
每次将在我询问点之前的串的编号加入 转移的时候注意把相同颜色的上一次出现位置的贡献减去即可
bzoj 4032 [HEOI2015]最短不公共子串
dp四合一 看了我好久
https://blog.csdn.net/elijahqi/article/details/80067255
codeforces 700E
https://blog.csdn.net/elijahqi/article/details/79711853
可以发现一个节点上不管长度 出现的次数一定相同 所以找长度大的来转移会更好 所以在dp的i时候仅仅处理最长的串
我们要做的是在转移的时候判断是否出现的两次 那么我们可以针对整个串建立sam 然后在par树上倒着从下往上每次合并两个节点的right集合用可持久化线段树维护
dp[x]表示x到根这条链上选若干个字符串出来组成a数组的最大值
bzoj 1396 识别子串
https://blog.csdn.net/elijahqi/article/details/80742726
先建sam 根据定义知道一个节点做出的贡献首先他有一段前缀一定只出现一次 用一个线段树维护每个节点的r[i]-i+1的最小值 另外和他par树上上一个节点重复的线段再往前+1即可 那么用另外的线段树记录 对于这一段区间他们的答案是众多r-l+1中取最小即可
bzoj 5084 hashit
蒟蒻我只会暴力qwq
https://blog.csdn.net/elijahqi/article/details/80780141

贪心(部分

codeforces 913C Party Lemonade
https://blog.csdn.net/elijahqi/article/details/79008889
将需要做的那个数字的二进制转换出来 递归求即可 注意一些细节
uoj174 新年的破栈
https://blog.csdn.net/elijahqi/article/details/79336500
考虑到打印的位置一定是栈头栈尾 还有新的这个数中的一个数根据我thuwc做题的时候想到的一个想法那么显然 我预处理下右端延伸的最小值 每次看右端有没有比我栈头和栈尾的还小的数 如果有我就一直过去把他加入栈里 如果没有就考虑对我的栈进行一些打印操作 一直到 满足我前面的条件则停止
BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操
https://blog.csdn.net/elijahqi/article/details/79337371
二分一下答案 然后贪心设d[x]表示每个节点距离最远的点是多少 然后贪心的把大于mid的都删去即可
然后统计需要删除的次数
bzoj4027 [HEOI2015]兔子与樱花
https://blog.csdn.net/elijahqi/article/details/79337911
贪心题,证明:https://www.cnblogs.com/YoungNeal/p/9084704.html
bzoj1034 [ZJOI2008]泡泡堂BNB
https://blog.csdn.net/elijahqi/article/details/79340034
神贪心 田忌赛马原理
bzoj1572 [Usaco2009 Open]工作安排Job
https://blog.csdn.net/elijahqi/article/details/79340240
用堆维护每个工作的价值从小到大 然后如果发现我新的价值比堆中元素大那么就用新的价值替换原来堆中的小价值的
bzoj1029 [JSOI2007]建筑抢修
https://blog.csdn.net/elijahqi/article/details/79341319
维护删除时间的最大值 然后如果新加入的时间比我这个要大一些那么显然是不优的
bzoj3668 [Noi2014]起床困难综合症
https://blog.csdn.net/elijahqi/article/details/79343858
按位贪心即可
bzoj3790 神奇项链
https://blog.csdn.net/elijahqi/article/details/79346331
贪心选择最少的线段数覆盖整个区间
那么可以考虑按照左端点排序 然后再按照右端点长度递降排序那么
可以知道在我当前左端点仍然小于等于右端点的时候是需要求一个我右端点最长延申的
bzoj3829 [Poi2014]FarmCraft
https://blog.csdn.net/elijahqi/article/details/79365916
2size[a]+f[b]+1>2size[b]+f[a]+1f[a]2siize[a]<f[b]2size[b] 2 ∗ s i z e [ a ] + f [ b ] + 1 > 2 ∗ s i z e [ b ] + f [ a ] + 1 , 即 f [ a ] − 2 ∗ s i i z e [ a ] < f [ b ] − 2 ∗ s i z e [ b ] 按照这个排序即可
bzoj1150 [CTSC2007]数据备份Backup
https://blog.csdn.net/elijahqi/article/details/79996196
要求k个不相邻的最小值
bzoj 4571 [Scoi2016]美味
主席树模拟trie树 贪心
https://blog.csdn.net/elijahqi/article/details/80314985
codeforces 402d Upgrading Array
https://blog.csdn.net/elijahqi/article/details/80304244
因为前缀gcd 有单调性所以 贪心的从后枚举然后统计好书多还是坏书多即可
codeforces 583b Robot’s Task
https://blog.csdn.net/elijahqi/article/details/80304231
从头到尾看什么时候敛齐即可
codeforces 276c Little Girl and Maximum Sum
https://blog.csdn.net/elijahqi/article/details/80233500
贪心统计每个区间询问次数即可
codeforces 272c
https://blog.csdn.net/elijahqi/article/details/80218844
分析题目 然后 询问区间最大值
bzoj 2006 [NOI2010]超级钢琴
https://blog.csdn.net/elijahqi/article/details/80176442
用一个堆贪心即可 因为有可能一个右端点 构成的区间分别是前k大

优化建图

bzoj5017 [Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
https://blog.csdn.net/elijahqi/article/details/78876147
得到拓扑序之后逆着推回来即可

你可能感兴趣的:(其他)