退役前的做题记录1.0
租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了。
但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来。
2018-09.18-2018-09.28
[BZOJ3613][HEOI2014]南园满地堆轻絮
可以证明答案就是差最大的逆序对的差的一半。
[BZOJ3612][HEOI2014]平衡
相当于是要选k个不同的数使它们和为0.正负分开,设\(f_{i,j}\)表示选\(i\)个数和为\(j\)的方案数,转移是\(f_{i,j}=f_{i,j-i}+f_{i-1,j-i}-f_{i-1,j-n-1}\),分别是给每个数加1,给每个数加1再插入一个1,以及不能让最大值超过n。算答案就枚举正负分别选多少然后背包卷一下,注意可以选一个0.
[BZOJ4007][JLOI2015]战争调度
直接爆搜每个点选取方案,复杂度是\(T(n)=2T(n-1)=2^n\).再做一个树上背包就好了。
[BZOJ5330][SDOI2018]反回文串
莫比乌斯反演+Pollard_Rho分解质因数,已经写了详细题解,此处不再赘述。
[BZOJ4850][JSOI2016]灯塔
这不是POI的原题吗?决策单调性瞎搞。
[BZOJ4857][JSOI2016]反质数序列
两个数加起来是质数就连一条边,相当于是要求最大独立集,如果只有不超过一个1的话原图一定是二分图(按奇偶),而超过一个1是没有意义的(1不能重复选),所以就直接dinic了。
[BZOJ4851][JSOI2016]位运算
从高位往低位一位位确定。假设选出的n个数按大小排列,我们用一个长为n的二进制数来表示当前每个数和下一个是否相同,最后一个数和R是否相同。发现每个0跟每个1的转移都是一样的,所以可以直接矩阵快速幂,复杂度\(O(2^{3n}(|S|+\log k))\)
[BZOJ4475][JSOI2015]子集选取
每个数都是独立的,答案一定是\(w^n\)的形式。观察发现答案就是\(2^{nk}\),可以列出递推式然后归纳证明。
[BZOJ4484][JSOI2015]最小表示
按拓扑逆序处理,按照一定顺序访问出边,用bitset存可到达的点,如果某条出边的加入并没有使可到达的点增多,那么这条边就可以删除。访问顺序按照最长路的顺序。
[BZOJ4472][JSOI2015]salesman
直接树dp+贪心即可。注意如果选了某个子树的权值为0那么也说明不唯一(可以不选)
[BZOJ4476][JSOI2015]送礼物
有两种情况,一种对所有长度为L的区间求答案,另一种情况,区间的两端点一定分别是最大值跟最小值。分数规划后推一下式子,相当于是要最大化前面的\(a_i-mid\times i\),用单调队列维护。
[BZOJ4477][JSOI2015]字符串树
对字符串建Trie树,有多少串包含这个前缀相当于是有多少包含在Trie树上这个节点的子树里。主席树维护到根路径上的信息,每次查询减一下lca。
[BZOJ4488][JSOI2015]最大公约数
枚举起点,\(\gcd\)往后走至多只会变化\(\log\)次,所以暴力二分找到最远点更新答案就行了,gcd用\(ST\)表求,复杂度两只\(\log\)。
[BZOJ4481][JSOI2015]非诚勿扰
假设某个女嘉宾的如意郎君有\(x\)个人,那么选到第\(i\)个人的概率就是\(\frac{p(1-p)^{i-1}}{1-(1-p)^x}\),二维偏序即可。
[BZOJ4482][JSOI2015]套娃
贪心,按照美观度依次选取最大的能放进去的放。
[BZOJ2743][HEOI2012]采花
离线询问,考虑每种颜色对答案的贡献,用树状数组维护。
[BZOJ4029][HEOI2015]定价
从后往前贪心放0.注意特判L和R位数不相同的情况。
[BZOJ4028][HEOI2015]公约数序列
分块,对每个块维护块内\(\gcd\),块内异或和,以及一个块内元素按照块内异或前缀和的排序数组,修改直接重构快,查询分两种,如果块内的前缀\(\gcd\)都相同就在排序数组上二分,否则暴力,因为会使得前缀\(\gcd\)改变的块至多只有\(\log\)个,所以复杂度\(O(n\sqrt n)\)。
[BZOJ2746][HEOI2012]旅行问题
建出\(fail\)树就是两点\(lca\)。
[BZOJ2745][HEOI2012]bridge
令\(A=m(m-1),B=(m-1)(m-2)+1\),题目就是在求\(A2^m\sum_{i=1}^{n}B^{i-1}i^m\)。\(m\)较小\(p\)较大可以接受\(m^3\)的矩乘,主要在于用杨辉三角构造\(i^m\);\(p\)较小可以求出循环节然后倍增(因为肯可能不存在逆元不能等比数列求和)
[BZOJ2067][POI2004]SZN
第一问答案恒定,非根节点贡献儿子个数/2向下取整,根贡献儿子个数/2向上取整。第二问先二分再贪心匹配,匹配时还要二分父向边和哪个儿子匹配,细节较多。
[BZOJ3872][POI2014]Ant colony
对每个点求:如果这个点到达根后数量为K则到这个点的蚂蚁数量的范围是多少,乘爆了可以直接设成inf,对于每个叶子节点二分即可。
[BZOJ3745][COCI2015]Norma
分治,每次考虑跨越mid的区间。i从mid循环到l枚举左端点,记左边的最大最小值为mx和mn,右边用单调指针维护最后一个小于等于mx的位置j和大于等于mn的位置k。右端点<=min(j,k)直接等差数列求和,>max(j,k)就是右边最大最小值乘积的后缀和,中间依照jk的相对大小可能是最小值或是最大值的区间和。维护六个东西:最小值、最大值、最大值乘最小值以及分别乘下标的前缀和即可。
[BZOJ5281][Usaco2018 Open]Talent Show
分数规划之后做遍背包,\(w_i\)超过\(W\)的直接当做是\(W\)。
[CF912E]Prime Gift
折半搜出所有不超过\(10^{18}\)满足条件的数然后二分求答案。
[CF875D]High Cry
维护每个数向左向右第一个不是自己子集的数的位置,从大到小分治做就行了。
[51nod1472]取余最大值
找区间最大值,暴力for小的一半,每次相当于是查询区间\([l,r]\)内等于\(v\)的有多少个。离线下来可以做到一个\(\log\)。
[51nod1348]乘积之和
分治\(FFT\)板子。精度貌似有点炸要\(MTT\)才行。
[51nod1752]哈希统计
倍增+循环卷积。
[BZOJ4861][Beijing2017]魔法咒语
\(l\)较小可以\(O(nl)\)dp,转移串长度小可以直接矩乘,矩阵大小为二倍AC自动机节点个数的平方。
[BZOJ4722]由乃
可以证明区间长度大于等于14一定有解,否则就\(meet\ in\ the\ middle\)一下\(O(3^7)\)爆搜。
[BZOJ4347][POI2016]Nim z utrudnieniem
设\(f_{i,j,k}\)表示前\(i\)堆里丢掉的堆数模\(d\)为\(j\),异或和为\(k\)的方案数。因为\(\sum a_i\)不是很大,所以每次枚举\(k\)就最大只枚举到\(a_i\)的最高位那么多,复杂度是\(O(\sum a_id)\)的。转移的时候异或的两个数可以一起转移,就不会卡空间了。
[BZOJ4345][POI2016]Korale
堆模拟搜索。先求出答案,然后找字典序最小,因为有了答案的限制,所以可以爆搜,状态数不会超过\(k\)。
[BZOJ3191][JLOI2013]卡牌游戏
\(f_{i,j}\)表示剩下\(i\)个人时第\(j\)个人活的概率,随便转移一下就好了。
[BZOJ3192][JLOI2013]删除物品
傻题不讲了。
[BZOJ3190][JLOI2013]赛车
维护一个第一象限的凸壳。
[BZOJ3193][JLOI2013]地形生成
组合计数,按高度从高到低考虑即可。
[BZOJ3990][SDOI2015]排序
可以发现交换顺序是没有关系的,所以每种本质不同的方案就给答案贡献次数的阶乘。从小往大的交换每次至多\(4\)中决策,复杂度\(O(4^n)\)
[BZOJ4600][SDOI2016]硬币游戏
暴力预处理\(SG\)函数就行了。
[BZOJ3131][SDOI2013]淘金
首先\(x,y\)坐标独立者很显然,然后因为个位数字含有的质因子只有\(2,3,5,7\),所以最后有金子的位置一定只含有这四个质因子,而在\(10^{18}\)内这样的数不多,所以直接数位\(dp\)一下记下状态。前\(k\)大就固定\(x\)坐标,用堆维护即可。
[CF981F]Round Marriage
hall定理。需要倍长后再加倍才能保证整个环都匹配上了。
[BZOJ1283]序列
线性规划网络流。
[LOJ6079][2017 山东一轮集训 Day7]养猫
上一题的加强版。课件里面讲了。
[CJOJ1851]免费航班
边双缩点然后树上换根\(dp\)求最长路。
[51nod1443]路径和树
建出最短路径\(DAG\)后跑个最小树形图,因为是个\(DAG\)所以直接给每个点选最小入边即可。
[UOJ67]新年的毒瘤
度数为\(m-n+2\)的非割点即为答案。
[BZOJ4883][Lydsy1705月赛]棋盘上的守卫
可以说是“最小生成基环森林”?总之是要保证每条边可以匹配每个点,所以一个连通块肯定是一个基环树。
[CF1053B]Vasya and Good Sequences
需要满足的条件是最大值不超过总和的一半且共含有偶数个1。因为最大值不超过60所以不满足前一个条件的区间长度不会超过60,暴力减掉即可。
[CF1053C]Putting Boxes Together
推一下式子,拿两个树状数组分别维护区间\(w_i\)之和以及\(w_i\times i\)之和。
[BZOJ3887][Usaco2015 Jan]Grass Cownoisseur
先scc缩点,之后在正反\(DAG\)上跑出从\(1\)出发的最长路,枚举哪一条边翻转即可。
[BZOJ1731][Usaco2005 dec]Layout 排队布局
差分约束。注意图可能不连通。
[BZOJ5185][Usaco2018 Jan]Lifeguards
先去掉被包含的区间,然后贪心\(dp\),转移分两种,一种是不选当前区间,一种是选,如果这个选的区间要和上一个选的有交那么一定会选一个左端点尽量靠左的。
[BZOJ5190][Usaco2018 Jan]Stamp Painting
合法的方案就是存在一个长为\(k\)的颜色连续段,考虑计算不合法的,\(f_i=i^m(i
[BZOJ1701][Usaco2007 Jan]Cow School牛学校
假设前\(t\)大的分数的分子之和为\(U\),分母之和为\(D\),则若要满足条件则需要存在\(i,j\)满足\(\frac{U-u_i+u_j}{D-d_i+d_j}>\frac UD\),其中\(i\)是前\(t\)大之一而\(j\)不是。划一下式子发现是要求\(Du_i-Ud_i\)的前缀\(\min\)跟\(Du_j-Ud_j\)的后缀\(\max\),Claris老师说满足决策单调性。
[BZOJ5071][Lydsy1710月赛]小A的数字
发现操作的本质是交换两个前缀和,所以就判一下两个序列的前缀和是不是全等就好了。
[BZOJ5072][Lydsy1710月赛]小A的树
对于一个固定的\(x\)它合法的\(y\)一定是连续的,所以只要算出最大值跟最小值就可以了。
[BZOJ5094][Lydsy1711月赛]硬盘检测
用对数计算\(n\)在每个取值下当前这种情况出现的概率,取最大的即可。
[BZOJ5091][Lydsy1711月赛]摘苹果
发现不管怎么说,移动到每个点的概率都是\(\frac {d_i}{2m}\)。
[BZOJ5090][Lydsy1711月赛]组题
分数规划,记录个方案输出时再转分数即可。
[BZOJ5074][Lydsy1710月赛]小B的数字
实际上就是给你一组\(a_i\)要你构造一组\(k_i\)使得任意\(i\)满足\(k_ia_i\ge \sum_j k_j\)。一个结论是\(\sum_i \frac 1{a_i}\le 1\)是可以构造出,否则不行。
[BZOJ5075][Lydsy1710月赛]小B的矩阵
答案肯定唯一。先考虑只有一列的情况,相当于已知每个格子及其相邻至多两个格子的雷数,可以按\(n\)模\(3\)的余数分三类讨论。列数不为一就先求出每行及其上下两行一共有多少雷,转化为只有一列的问题。
[BZOJ4921][Lydsy1706月赛]互质序列
前缀后缀\(\gcd\)只会变化至多\(\log\)次,所以就暴力\(\log^2\)搞一搞好了。
[BZOJ4922][Lydsy1706月赛]Karp-de-Chant Number
每个括号序列消完后一定是一段前缀右括号跟一段后缀左括号。可以理解为:你要接受当前这个括号序列作为下一个串,就要先付出前缀右括号数量的左括号,然后可以得到所有的后缀左括号。按左括号总量是增多还是减少分两类,对于左括号增多的,肯定是优先选前缀右括号数量少的,而对于左括号减少的,你倒过来看就是右括号增加,所以是优选后缀左括号数量多的。排完序后大力做个\(O(n^3)\)背包即可。
[BZOJ4923][Lydsy1706月赛]K小值查询
考虑用平衡树维护序列。每一个修改对于\([1,k)\)的数没有影响,对于\((2k,+\infty]\)的数在全局的相对大小也没有影响,打标记即可。需要修改的数是\([k,2k]\),把这段区间抠出来暴力改。发现这样一来每个数至多被暴力修改\(\log\)次,所以复杂度就对了。
[BZOJ4891][TJOI2017]龙舟
(洛谷上数据范围是假的,这个题明明就是\(2\times 10^{18}\))把\(M\)质因数分解,然后分子分母也一一分解,如果约分后分母与\(M\)的\(\gcd\)不为\(1\)则无解,对\(M\)算一下\(\varphi(M)\)直接算逆元即可。
[BZOJ4890][TJOI2017]城市
暴力\(O(n^2)\)换根\(dp\)就过了...
[BZOJ4888][TJOI2017]异或和
考虑每一位是不是\(1\)。首先对序列做前缀和,根据这个数在当前这位是\(1\)还是\(0\)可以确定另一个前缀的取值范围,树状数组维护即可。
[Luogu4471][BJWC2018]词韵
对反串建\(Trie\),每个点可以接他的父亲/儿子/兄弟,跑个树\(dp\)。
[Luogu4577][FJOI2018]领导集团问题
线段树合并。
[BZOJ3864]Hero meet devil
(为了做下面那道题跑去写的)\(dp\)套\(dp\)。考虑求\(lcs\)的数组\(f_{i,j}\),其相邻两位的相差不会超过\(1\),所以差分一下就可以用一个二进制串表示一个\(lcs\)的匹配状态。复杂度\(O(n2^m\times4)\)。
[BZOJ5336][TJOI2018]游园会
和上面那题一样,再多开一维状态记串\(NOI\)的匹配状态。
[BZOJ5337][TJOI2018]碱基序列
\(hash\)之后简单\(dp\)即可。
[BZOJ5298][CQOI2018]交错序列
考虑\(x^ay^b=(n-y)^ay^b=\sum_{i=0}^a\binom{n}{i}(-1)^{a-i}y^{a+b-i}\)。所以只要能求出\(y\)的若干次幂就行了。矩乘即可,矩阵大小为\(2(a+b+1)\),较卡常,需要尽量减少取模次数。
[UOJ62] 【UR #5】怎样跑得更快
其实连\(\sum_{j=1}^nf(\gcd(i,j))\times g(i)\times h(j)\times x_j=b_i\)都可做呢。
讲道理做三次反演就好了,中间要判一下无解的情况(除零)
[CF809D]Hitchhiking in the Baltic States
考虑经典的\(lcs\)求法,设\(f_i\)表示长度为\(i\)最后一个元素的最小值。
对于一个\([L,R]\),找到最后一个小于\(L\)的位置\(p\),那么\(f_{p+1}\)可以被更新为\(L\),\(f_{p+2}\)被更新为\(f_{p+1}+1\),直到最后一个小于等于\(R\)的位置\(q\)。
相当于是区间平移,用平衡树维护即可。
[BZOJ3073][Pa2011]Journeys
线段树优化连边,需要建两棵线段树,一棵入边一棵出边。\(01\)最短路可以做到线性复杂度。
[Wannafly挑战赛21E]未来城市规划
维护边权\(\times sz_i\)以及边权\(\times sz_i^2\)的区间和即可。
[BZOJ4598][SDOI2016]模式字符串
\(O(n\log n)\)点分治。据说长链剖分可以做\(O(n)\),然而我并不会\(O(1)\)继承长儿子啊怎么办。。。dalao们教教我吧
[BZOJ4599][SDOI2016]墙上的句子
网络流,最小割建图。
[BZOJ4517][SDOI2016]排列计数
选\(m\)个不动,剩下的错排。
[BZOJ4602][SDOI2016]齿轮
分解质因数然后\(dfs\)。