板刷蓝色省选计划
一些用到不会的算法(如网络流)的题和 yue 题会直接跳过 qwq
- update on 2022/12/12: 把码换成了提交记录。
2022/12/05
白天的题就不写了awa
P2149 [SDOI2009] Elaxia的路线
出师不利(
考虑求出第一个人所有在最短路上的边,第二个人所有在最短路上的边(有向)
然后两条最短路的最长公共路径一定是一条链,且两个人在每条边上的方向要么都相同要么都相反。
然后就好做了,考虑到所有最短路上的边连起来的图一定是个 \(\verb|DAG|\),\(\verb|DAG|\) 的子图还是 \(\verb|DAG|\)。于是扣出所有方向相同的边求个最长路,所有方向相反的边再求一遍即可。
P2151 [SDOI2009] HH去散步
考虑如果没有连续两次不能走同一条边的限制,那么直接来。
有了这个性质后看起来不可做,但发现 \(m \le 60\),于是可以从这里入手。
考虑把状态定义成 \(f_i\) 表示最后一次走了 \(i\) 这条边的方案数。
这样矩阵 \(g_{i,j}=1\) 当且仅当 \(v_i = u_j\) 且 \(i,j\) 不是同一条边。
这里我的做法是把边复制一份做反边,算 \(g\) 的时候特判一下即可。
2022/12/06
P2155 [SDOI2008] 沙拉公主的困惑
刚开始没啥想法,手玩一下后可以发现一个性质就是所有区间 \([1,M!],[M!+1,2M!],[2M!+1,3M!],\ldots\) 这些区间内与 \(M!\) 互质的数的个数都相同,为 \(\varphi(M!)\)。
证明用辗转相除法即可。
然后求 \(\varphi(M!)\) 实际上就是:
然后发现这个东西可以线性预处理,然后就做完了。
但是当 \(mod \le M\) 时会寄。当时没想通,瞄了眼题解,会了。
大概是再预处理两个东西,一个是 \(\sum \dfrac{p-1}{p}\),但当 \(mod=p\) 时不除,一个时 \(M!\),但不包含 \(mod\)。
这样当 \(mod \le M\) 时就直接用后面两个东西乘起来就行了。
P2163 [SHOI2007]园丁的烦恼
二维数点板板。
P2167 [SDOI2009]Bill的挑战
看数据范围一眼状压。设 \(dp_S\) 表示选让 \(S\) 中的字符串都能匹配的方案数。直接计算。时间复杂度为 \(O(mn2^n)\)。这里 \(m\) 表示字符串的长度
但是没有考虑到 \(S\) 以外的字符串也能匹配的情况,故需要去重。
刚开始写了个 \(O(2^{2n})\) 的,炸了。
于是考虑换个角度,用当前值去更新其他值,也就是枚举子集的子集,时间复杂度为 \(O(3^n)\)。
P2215 [HAOI2007]上升序列
第一眼把询问离线下来然后 \(O(n^2)\),仔细一想发现没必要,先求出以每个位置为起点的 \(\verb!LIS!\) 的长度,然后从前往后贪心取即可。
P2220 [HAOI2012]容易题
设 \(sum_i\) 为 \(a_i\) 可能的取值的总和,则答案显然为
考虑到只有最多 \(k\) 个位置会被修改,剩余的都有 \(sum_i = \dfrac{n(n+1)}{2}\)。
于是只需要考虑被修改的几个,那么拿两个 \(\verb!map!\) 记一下即可。
P2224 [HNOI2001]产品加工
DP 板子,设 \(dp_{i,j}\) 为前 \(i\) 个产品,第一台机器用了 \(j\) 时间,第二台机器用的时间最少是多少。
然后发现空间被卡了,滚动数组即可。
然后被卡常了/kk。
解决方法是转移的时候限定上界减小常数。
P2228 [HNOI2001]洋洋吃蛋糕
看到 \(m \le 10\),一眼状压,设 \(dp_{i,S}\) 表示前 \(i\) 行最后一行状态为 \(S\) 的答案。可以转移当且仅当把连续的 \(1\) 看做区间,上一行与这一行的区间互不相交。用位运算判一下即可。复杂度 \(O(n2^{2m} + nm2^m)\)。
然后又被卡常了,于是考虑预处理出来每个状态可以转移的状态用 \(\verb!vector!\) 存起来即可。
P2236 [HNOI2002]彩票
yue 搜索,没啥好说的
P2303 [SDOI2012] Longge 的问题
考虑枚举 \(k=gcd(i,n)\),显然其一定是 \(n\) 的约数。接下来要求有多少个数满足 \(gcd(i,n)=k\)。刚开始想容斥但是复杂度不对。后来想了想其实就是要求 \(1 \sim \dfrac{n}{k}\) 内与 \(\dfrac{n}{k}\) 互质的数的个数,即 \(\varphi(\dfrac{n}{k})\)。
时间复杂度 \(O(\sum\limits_{d|n}\sqrt{d})\)。不会算,但是看起来挺小的,实际也最慢只跑了 \(5ms\)。
2022/12/07
P2279 [HNOI2003]消防局的设立
考虑贪心,求出每个点的深度后每次选一个最深的未被覆盖的点,将其祖父设为消防局。由于当前点是最深的,所以选祖父一定比选他或他的父亲或他的兄弟不劣。
考虑维护,设一个数组 \(f_i\) 表示离点 \(i\) 最近的消防局的距离。每次设立消防局则
每次查找点时只要判断是否有 \(\min(f_i,f_{fa_i},f_{fa_{fa_i}}) \le 2\) 即可。
P2278 [HNOI2003]操作系统
按题意模拟。
P2328 [SCOI2005]超级格雷码
仿照二进制格雷码的思路,每次把 \(n-1\) 位格雷码复制 \(B\) 遍,其中第偶数遍 \(\verb!reverse!\),然后在最高位上分别添 \(0 \sim B-1\) 即可。
然后发现这个东西类似树形结构,于是可以直接 \(\verb!dfs!\)。打一个 \(\verb!tag!\) 表示当前是否要翻转,每次添加的数如果是奇数就让 \(\verb!tag!\) 反一反即可。
P2332 [SCOI2006]数字立方体
考虑枚举一个正方形,然后把以他为底的立方体给扣出来,然后就变成了一个一维的问题,然后直接前缀和就做完了。
我在说什么,我是听也听不懂。
2022/12/08
第四天就咕咕咕了,不愧是我(
P3847 [TJOI2007]调整队形
区间 \(\verb!dp!\) 板子题,设 \(dp_{l,r}\) 表示将这个区间改成回文串的最小代价。转移为:
2022/12/09
P2055 [ZJOI2009] 假期的宿舍
比较简单的网络流。
要睡觉的点放左边,有床的点放右边,认识就连边,然后二分图最大匹配即可。
P2057 [SHOI2007] 善意的投票 / [JLOI2010] 冠军调查
不会,于是看了眼题解。
大概是建两个虚点分别表示睡觉和不睡觉,然后每个人与自己的观点连边,再与朋友连边表示要求朋友与自己观点相同,然后就变成了断掉最少的边使得两个虚点分开。然后就是让其中一个为源点,另一个为汇点求最小割。
P2065 [TJOI2011] 卡片
打开一看:这不二分图匹配板板?码完一交:\(\verb!Duangggggg!\) 的一下,\(3\) 个 \(\verb!TLE!\)。
考虑优化,只能从建图入手了。
考虑不互质就必然有至少一个公共质因数,于是可以建一车虚点表示质因数,然后每个点和他的质因数连边即可。
P2407 [SDOI2009]地图复原
考虑到题目保证有合法解,那么这个问题就很简单了。
从上往下从左往右扫过去,对于一个 T
,如果他左边或上边有接口就连接接口,如果没有就往反方向伸出接口,比如左边没有接口就往右边伸出接口。
S
同理,上方有接口就垂直,否则水平。
显然这样做是对的。
P2453 [SDOI2006]最短距离
简单 \(\verb!DP!\)。设 \(DP_{i,j}\) 表示原串的前 \(i\) 个已经没了,目标串完成了前 \(j\) 个的最小代价,然后直接转移即可。
2022/12/11
P2464 [SDOI2008] 郁闷的小 J
考虑分块,然后这题做完了。
直接来用 \(\verb!map!\) 当桶是带 \(\log\) 的,可以把询问离线下来然后离散化去掉 \(\log\)。如果直接来的话可能被卡常。
2022/12/12
P2467 [SDOI2010]地精部落
不会做,看题解。
设 \(dp_{i,j}\) 表示前 \(i\) 个数,第一个数是山峰,第一个数是 \(j\) 的合法方案数。
考虑第二个数是不是 \(j-1\),如果不是,那么方案数等同于 \(dp_{i,j-1}\),因为可以直接 \(\verb!swap!\) \(j\) 和 \(j-1\)。
如果是 \(j-1\),相当于是 \(i-1\) 个数,第一个数是山谷且是 \(j-1\) 的合法方案数,方案数等同于 \(dp_{i-1,i-j+1}\),因为可以把每个数 \(x\) 变成 \(i-1-x+1\),这样第一个数就变成了 \(j-1\),并且是山谷。
然后这两个东西加一加就好了。
P2471 [SCOI2007] 降雨量
新人求助,降雨量那题,本机AC提交RE。。
简单板子题,写个 \(\verb!ST!\) 表然后大力分讨一下就好了。
P2485 [SDOI2011]计算器
多合一板子题,没啥好说的。
P2502 [HAOI2006]旅行
发现数据范围很小,于是可以考虑枚举最小值,然后建最小生成树求最大值最小是多少。时间复杂度 \(O(m^2)\)。
P2503 [HAOI2006]均分数据
退火板子,考虑随一个排列然后当连续的做,然后没了。
P2507 [SCOI2008] 配对
首先容易想到如果没有相同的数不能匹配的限制的话直接两个都排序然后一一配对即可。
然后不会了,看了眼题解,发现是人类智慧,每个点匹配一定不会离很远,所以直接枚举三个以内全排列即可。
P2512 [HAOI2008]糖果传递
大力推式子题,但是题解讲得太好了,所以直接把题解链接扔这里了:https://m-sea.blog.luogu.org/solution-p2512
P2515 [HAOI2010]软件安装
板子题,缩点后树上背包即可。
P2520 [HAOI2011]向量
菜死了,这种题做半天/kk
考虑把 \(x\) 和 \(y\) 分开来。
把原来的操作简化成:
发现后面两个最多用一次。
于是单独考虑前面四个,列出方程:
只要暴力枚举后两种向量的使用情况,然后分别判断上面两个方程是否都有解即可。
P3998 [SHOI2013]发微博
本来是个 EZ 题,结果满脑子异或哈希,异或哈希,异或哈希,于是就查看题解了(悲
考虑 \(v\) 对 \(u\) 的贡献可以用前缀和来表示,即解除朋友时 \(v\) 的微博数减去成为朋友时 \(v\) 的微博数,于是哪个数组记录每个人的微博数,然后在成为和解除朋友的时候统计答案即可。
2022/12/13
P2522 [HAOI2011]Problem b
莫反板子,先区间左右端点都 \(\div k\),然后就变成了求互质,然后拆成四个莫反就好了。
考虑到数据范围有 \(5 \times 10^4\),所以整除分块优化一下即可。
2022/12/14
P2530 [SHOI2001]化工厂装箱员
可以发现每次补满 \(10\) 个是无用条件,因为如果不补满一定没有补满优。
于是设 \(dp_{i,j,k,l}\) 表示前 \(i\) 个物品,手里剩下 \(j\) 个 A,\(k\) 个 B,\(l\) 个 C 的最小代价,转移就是把第 \(i\) 个拿到手里,以及把一种物品装箱。
P2547 [AHOI2004]DNA变异
发现串长只有 \(8\),于是暴力枚举变异然后拿个 \(map\) 记一下就行。
会被卡常,可以改哈希或者把串当成四进制数转十进制存。
P2571 [SCOI2010]传送带
考虑到路径一定是 \(AB\) 走一段(可能为 \(0\)),平面走一段,\(CD\) 走一段(可能为 \(0\))。
假设已经固定在 \(AB\) 上走了多少,时间关于在 \(CD\) 上的距离的函数是单峰的,于是可以三分。
再考虑算上 \(AB\) 上的路径,毛估估也是单峰的,于是三分套三分做完了。
P2579 [ZJOI2005]沼泽鳄鱼
一眼矩阵。每次乘上邻接矩阵,但是如果某个点上有食人鱼那么这一列全是 \(0\)。
发现这个东西不太好维护。
但是发现每条鱼的周期为 \(2,3,4\),所以把 \(12\) 个看成一个周期,先预处理连续十二个矩阵的乘积,然后对于多余的再暴力乘。矩阵乘法满足结合律,所以有正确性。
2022/12/20
P2581 [ZJOI2005]Genotype
洛谷上题面不对,数据范围也不对,对着假的题面和假的数据范围看了半天,结果就这?
做法是 DP 预处理出每个区间能合并成多少种字符,然后设 \(dp_i\) 表示前 \(i\) 个字符的答案,然后转移,然后没了。
P2589 [ZJOI2006]碗的叠放
发现 \(n \le 9\),一眼直接全排列枚举顺序,问题在于如何 check。
若只考虑一只碗放在另一只上,那么之可能是三种情况:上面的碗的碗底卡住、上面的碗的碗口卡住、下面的碗的碗口卡住。
然后分讨一下取个最大值就做完了。
然后考虑多只碗,那新放上来的碗必然会卡在某一只碗上,所以枚举之前的碗取个最大值。然后整道题都做完了。
P2591 [ZJOI2009]函数
恶心找规律题。
P2592 [ZJOI2008]生日聚会
简单 DP。考虑设 \(dp_{i,j,p,q}\) 为 \(i\) 个男生,\(j\) 个女生,所有后缀中男生比女生最多多 \(p\) 人,女生比男生最多多 \(q\) 人的方案数。
直接转移即可。
P2593 [ZJOI2006]超级麻将
一眼 DP,考虑到同一种吃最多两个,所以设 \(dp_{i,a,b}\) 表示前 \(i\) 种牌,第 \(i-1\) 种剩 \(a\) 张,第 \(i\) 种剩 \(b\) 张有没有可能。
然后转移的时候因为剩余的牌都用来吃,所以 \(i-2\) 一定要被吃完,其他可以剩下。
然后问题就是第 \(i\) 种多余的牌能不能通过碰和杠解决掉。这个我想了半天数学方法,然后发现可以直接背包……
然后唯一的问题就是要解决一对。我一开始的想法是正着做一遍倒着做一遍然后枚举一对牌的种类,但是这样写起来很麻烦。考虑到数据范围很小且目前复杂度只有 \(O(100n)\),可以每次枚举一对牌的种类然后删掉两张牌跑一遍 DP。复杂度 \(O(10^4\cdot n)\)。
P2532 [AHOI2012]树屋阶梯
考虑 DP。发现 \(n\) 级台阶用正好 \(n\) 个矩形,所以每个矩形的右上角必然是一个台阶。
考虑枚举覆盖最左下角的矩形的右上角,发现这个矩形把整个台阶分成了两个子问题,然后就可以 DP 了。
发现这个东西就是卡特兰数。
最后上个高精就好了。
P2457 [SDOI2006]仓库管理员的烦恼
转化一下,变成选最多的货物不动。
考虑讲行与列一一匹配,权值是该行该列的格子上的数,相当于要求二分图最佳匹配,然后就是板子了。
2023/01/02
P3155 [CQOI2009]叶子的染色
观察发现任意点当根时答案相同,所以随便找个点当根即可。
然后设 \(dp_{u,0/1/2}\) 为以 \(u\) 为根的子树,\(u\) 染白/黑/不染色的答案即可。
2023/01/04
P3831 [SHOI2012]回家的路
将图分层,一层连纵向的边,一层连横向的边,边权为 \(2 \times \text{边数}\),两层的同一个点之间连边权为 \(1\) 的边即可。
P3833 [SHOI2012]魔法树
树剖板子
P3843 [TJOI2007]迷路
暴力模拟两人路径长度的 \(lcm\) 遍即可。
P3845 [TJOI2007]球赛
首先对于每一个数据可以将较小的放在一边,较大的放在另一边。
然后对数据按第一关键字排序,排序之后相当于把由第二关键字组成的序列拆分成若干个上升子序列,求最小拆分数。
Dilworth 定理:对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目。
将一个序列划分成若干上升子序列,最小划分数目与最长下降子序列的长度相等。故求一下最长下降子序列即可。
P3737 [HAOI2014]遥感监测
求出能包含每个点的圆的圆心的横坐标的取值范围,然后问题转化成求最少需要多个点使得任意一个区间都包含至少一个点。
把区间按右端点排序然后贪心取即可。
P3848 [TJOI2007]跳棋
目前好像没啥正经解法,数据过水,直接搜就完了。
P3854 [TJOI2008]通讯网破坏
建圆方树,问题转化为在圆方树上删掉点 \(M\) 后 \(S,T\) 是否联通。
显然当且仅当 \(M\) 在 \(S,T\) 的路径上时 \(S,T\) 才不联通。
P3873 [TJOI2010]天气预报
矩阵加速板子。
P3874 [TJOI2010]砍树
相当于要取出一些点使得 \(\dfrac{\sum v}{\sum w}\) 最大,于是考虑分数规划。
即二分答案,然后将每个点的权值设为 \(v_i - w_i \times mid\),然后求是否存在一种取法使得权值和 $ \ge 0$,直接 DP 即可。
P3879 [TJOI2010] 阅读理解
map<string,vector<int>>
,没了。
复杂度正确。
注意一个词在同一篇文章中出现多次仅计算一次,所以要再拿个 map<string,int>
记录一下。
P3891 [GDOI2014]采集资源
设 \(dp_{i,j}\) 为当前效率为 \(i\),资源为 \(j\),所需最小时间。状态转移方程:
2023/01/05
P3961 [TJOI2013]黄金矿工
对于同一直线的点,必须先取纵坐标小的,再取纵坐标大的,形成一个依赖关系。
所以把每条直线扣出来当作一个物品然后背包即可。
P3963 [TJOI2013] 奖学金
刚开始想二分,然后发现没有单调性。
那就考虑枚举每个人判断是否合法。
考虑 check,显然成绩比他小的和比他大的都取奖学金最小的 \(\dfrac{n}{2}\) 个。
然后用一个大根堆跑两遍 \(O(n)\) 预处理一下,然后就做完了。
2023/01/06
P5268 [SNOI2017]一个简单的询问
考虑差分,设 \(g(i, x) = get(1, i, x)\),则:
然后一个询问拆成四个再莫队就做完了。
2023/01/10
P5502 [JSOI2015]最大公约数
一个经典 Trick:以某个点为左端点的区间的 \(\gcd\) 的种类只有 \(\log 值域\) 种,且每一种是后一种的倍数。
于是考虑对于每个点二分求 \(\gcd\),复杂度三只 \(\log\)。
但是很容易想到从右往左枚举左端点,显然每一个左端点可以继承上一个的答案。即这个左端点的右端点分界点一定是上一个左端点的答案的子集加上当前这个点。于是复杂度就是两只 \(\log\) 了。
其实可以进一步优化,因为确定左端点后右端点一直向右扩展,所以每次 \(\gcd\) 继承上一次的答案,复杂度一只 \(\log\)。