总结
AubRain
·
·
个人记录
总结——小题解合集
P3745 [六省联考2017]期末考试
贪心+双指针。
枚举天数,双指针即可。利用前缀和后缀和计算答案。
P3746 [六省联考2017]组合数问题
矩阵乘法。
转移方程 f_{i ,j}=f_{i-1,(j-1)mod\;k}+f_{i-1,j}
最后 f_{n*k,r} 即为答案。注意特判 k=1 的情况
P3747 [六省联考2017]相逢是问候
线段树+欧拉定理。
指数对phi(p)取模,再对phi(phi(p))取模,最多log次模数就变为1
线段树记录区间取模次数即可。
然后最毒瘤的是判断是否 \ge 模数,要在快速幂里面判断,细节不少。
要用光速幂计算c的幂
P4068 [SDOI2016]数字配对
费用流。
想办法建立二分图。配对的条件a_i 是 a_j 的倍数,且 a_i/a_j 是一个质数,所以按照质因子指数和 建图。奇数连s,偶数连t。
总价值和\ge 0 的条件增广的时候判一下就行了。
P4251 [SCOI2015]小凸玩矩阵
二分答案+网络流。
二分第k大是多少,网络流判断能否选出n-k+1个\le它的数。
P4589 [TJOI2018]智力竞赛
二分答案+网络流
先传递闭包,把所有小于mid的值建图。最小路径覆盖问题即可。
P3247 [HNOI2016]最小公倍数
分块+并查集+套路。
先把边按照a排序,分成\sqrt m 块。对于第i块,只处理a在该块之间的询问。
首先把该块以前的所有边按照b再排序,询问也按照b排序。双指针加入之前的边。
然后枚举当前块的所有合法边,加进去。这里要带撤销。
然后并查集记录连通块a,b最大值就行了。
每个询问会枚举\sqrt m 条边,加上并查集按秩合并,复杂度 O(m\sqrt m logm)
P4108 [HEOI2015]公约数数列
分块。
见前缀gcd就要想最多有log种。
每个块开一个map,记录每个前缀异或和的位置。再记录区间gcd。
修改的时候暴力重构这个块,把后面所有块都打上异或标记。
询问就枚举每个块,如果这个块里没有分界点,那么就map找一下。否则就暴力枚举每个元素判断。
复杂度 O(q\sqrt n log^2n) 。能跑过去就是奇迹。
P3245 [HNOI2016]大数
莫队。
记录前缀表示的数,然后就是 \frac{s_i}{10^i}==\frac{s_j}{10^j} 的有多少对。莫队即可。
注意p=2或5的时候10没有逆元,要特判。
P4211 [LNOI2014]LCA
树剖+离线。
相当于把[l,r]到根的路径上的点都+1,再询问z到根的权值和。
P3241 [HNOI2015]开店
树剖+主席树。
就是上一题加上强制在线。主席树+标记永久化维护就行了。
P3243 [HNOI2015]菜肴制作
贪心+堆。
反图上大根堆拓扑排序即可。
P3171 [CQOI2015]网络吞吐量
最短路+网络流。
点权化边权最短路径上最大流。
P4345 [SHOI2015]超能粒子炮·改
Lucas定理。
设答案为f(n,k),把Lucas式子写出来,容易发现
f(n,k)=f(n\%k,p-1)*f(n/p,k/p-1)+C(n/p,k/p)*f(n\%p,k\%p)
递归计算即可。
P3705 [SDOI2017]新生舞会
分数规划+费用流。
二分答案后最大费用流判断费用是否\ge0即可。
P4071 [SDOI2016]排列计数
组合数+错排。
ans=C(n,m)*d[n-m]
d[0]=d[2]=1,d[i]=(i-1)*(d[i-1]+d[i-2])
P3320 [SDOI2015]寻宝游戏
set+思维。
按照Dfs序递增访问肯定是最优的,用set维护Dfs序就行了。
P3242 [HNOI2015]接水果
整体二分+扫描线。
Dfs序上,每个盘子相当于二维平面一个区间。每次询问相当于求包含这个点的区间的权值k小。整体二分即可。统计的话就差分一下,扫描线。
#4472. [Jsoi2015]salesman
树形dp+贪心。
每个点贪心的选儿子dp值前几大的就行了。至于方案唯不唯一,判一下就行了。
P2585 [ZJOI2006]三色二叉树
树形dp。
没了。
P4109 [HEOI2015]定价
枚举。
[**P4099** [HEOI2013\]SAO ](https://www.luogu.org/problemnew/show/P4099)
树形dp。
树形图拓扑序计数。合并相当于合并两个序列。
**状态:**$f[x][i]$ 表示$x$子树中,$x$的拓扑序在子树中排名为$i$的方案数。
**转移:**$f[x][k]=f[x][i]*f[y][j]*C_{k-1}^{i-1}*C_{sz[x]+sz[y]-k}^{sz[x]-i}
边界:f[x][1]=1
条件:若x在y前,j \in [k-i+1,sz[y]],否则j\in[1,min(sz[y],k-i)]
优化:树形背包sz优化,前缀和优化。
P3345 [ZJOI2015]幻想乡战略游戏
动态点分治。
先把点分树构建出来。这道题里点分树有两个作用:
1、可以维护每个点为根时的答案。
2、可以在点分树上爬,找到最优解。
一张图看懂动态点分治的精髓。精髓就在于加上自己的,减去父亲的。
没什么用的性质:1、点分树上一个子树是原树的一个连通块。2、点分树两点LCA一定在原树两点路径上。
注意在点分树上爬的时候比较的不是 x和儿子的值,而是 x和儿子那个连通块离x最近的点的值。如果更优就爬到儿子。
P3246 [HNOI2016]序列
rmq+思维。
预处理 f[r]=\sum_{i=1}^r min\{a[i...r]\} , g是f的前缀和。
f[r]=f[pre[r]]+a[r]*(r-pre[r])
先找到[l,r]的最小值位置p,然后推一下式子就行了。
P4104 [HEOI2014]平衡
整数划分+dp。
状态:f[i][j]表示i划分为j个不同的[1,n]的数的方案数。
转移:f[i][j]=f[i-j][j-1]+f[i-j][j]-f[i-n-1][j-1]
前面是整数划分式子,后面是保证最大值为n。最后枚举左边放几个总和为多少统计答案就行了。
P3250 [HNOI2016]网络
整体二分+树剖。
如果所有\ge mid的路径都经过x,说明答案<mid 。
P3265 [JLOI2015]装备购买
线性基+高斯消元。
排序后逐个加入。实数意义下的线性基就是把异或变成了高斯消元。
P4655[CEOI2017]Building Bridges
斜率优化。
由于查询的斜率和x坐标都不是单调的,所以要维护动态凸包。
用set维护即可,自定义<,查询的时候把<定义成斜率小于就行,维护的时候<定义为x坐标小于。
为了保险起见,把切点附近20个点都枚举一下。
P3967 [TJOI2014]匹配
费用流。
二分图求一定在最大权匹配上的边的个数。枚举删掉每条边,如果最大权匹配变小说明这条边删不得。
CF24D Broken robot
期望dp+高斯消元。
dp方程显然,可是转移有环。考虑高斯消元。
发现个方程最多只涉及三个变量,于是就可以O(n)高斯消元了。
P3172 [CQOI2015]选数
计数+容斥。
首先l=ceil(l/k),r=floor(r/k) ,转化为gcd=1的方案数 。
枚举gcd从[1,r-l+1],算出区间内有x个倍数,然后f[i]=x^n-x,意思就是只能选倍数,但是不能都选一样的数的方案(防止gcd超过枚举范围。
然后容斥,f[i]-=f[i*k] 。f[1]+(l==1)就是答案。
P4107 [HEOI2015]兔子与樱花
贪心。
[**P4075** [SDOI2016\]模式字符串](https://www.luogu.org/problemnew/show/P4075)
点分治+哈希。
一眼题。分治的时候用哈希记录前缀后缀匹配长度,统计一下就行了。
[**P5038** [SCOI2012\]奇怪的游戏](https://www.luogu.org/problemnew/show/P5038)
二分答案+网络流。
二分图染色,然后分类讨论。
如果黑点个数不等于白点个数,那么最后的答案可以算出来,判断是否合法即可;否则就二分最后的值是多少,然后最大流判断是否满流即可。
[**P3721**[AH2017/HNOI2017\]单旋](https://www.luogu.org/problemnew/show/P3721)
权值线段树+set。
插入:用set找前驱后继,插到深度较大的那个下面。
单旋:子树深度不变,剩下所有点深度+1,看做线段树的区间加。
[**P3176** [HAOI2015\]数字串拆分](https://www.luogu.org/problemnew/show/P3176)
矩阵乘法。
$f[r]$表示前r个数的转移矩阵,于是$f[r]=\sum f[l] \times w[l+1][r]$ 。
预处理$w$数组即可。这里把加法转成矩阵乘法,拥有结合律。
[**P3830** [SHOI2012\]随机树](https://www.luogu.org/problemnew/show/P3830)
期望$dp$。
第一问直接$O(n)$递推即可,$g[i]=g[i-1]+\frac 2 i$ 。
第二问$f[i][j]$表示$i$个叶节点深度为$j$的概率。枚举左右儿子的点数和深度转移即可。
[**P3649** [APIO2014\]回文串](https://www.luogu.org/problemnew/show/P3649)
SA+hash。
本质不同回文子串是$O(n)$的,然后先求出所有回文子串,再用SA判断一下次数就行了。方法是从$rk[l]$向两边拓展,二分找到最长的一段使得$ht>=r-l+1$ 。SAM+倍增也是ok的。
[**P4438**[HNOI/AHOI2018\]道路](https://www.luogu.org/problemnew/show/P4438)
树形$dp$。
唯一的难点在读题。$f[x][A][B]$表示在x,到根有A条没修的铁路,B条没修的公路的最小代价。枚举左右儿子修哪个即可。记搜实现短的一匹。可以优化空间但没必要。
[**P4437**[HNOI/AHOI2018\]排列](https://www.luogu.org/problemnew/show/P4437)
贪心+堆。
吐槽:HNOI的题面太苟了。
贪心经典题。题意就是给出每个点的父亲和权值,然后归并这棵树。[原题poj2054](http://poj.org/problem?id=2054)
刚开始每个点看做一个序列,贪心策略是每次选**平均值最小**的序列,把他合到父亲序列上,顺便统计贡献,再更新父亲的序列。用个堆就可以维护了。
[**P3731** [HAOI2017\]新型城市化](https://www.luogu.org/problemnew/show/P3731)
最大匹配必须边。
跑完dinic之后对有流量的边(单向)跑tarjan。
最大匹配可行边,(x,y)没流量了或者x,y在同一个强联通分量内。
最大匹配必选边,(x,y)没流量了并且x,y不在一个强联通分量内。