杂题练习笔记(思路)
AT1999 [AGC002E] Candy Piles
思路:
博弈论好题.我们转化一下题目,可以建一张图.(纯手工制作)
对于数列\(A[]={5,4,4,2,1,1}\)来说我们可以建成这样.
我们的起始点在左下角,第一种操作等价于向右走,第二种操作等价于向上走.走出去相当于先手输.可以发现除了边界,同一对角线的胜负情况相同.于是用手推一下式子即可.
AT4519 [AGC032D] Rotation Sort
思路:
- 可以发现有些数是不会动的,而且这些数字构成上升子序列.
- 并且一个数如果移动那么它最多移动一次.
设\(dp_i\)表示最后一个不动的数位置为\(i\),且将\(1,..,i\)的数摆放好位置所需的最小代价. 考虑将\(i\)接到\(j\)上面,那么它们之间的数都需要移动.枚举它们之间的每一个数\(x\).
若\(x>A[i]\),那么说明这个数需要往右移动,反之往左移动.于是\(dp\)的转移方程就出来了.
为什么这样\(dp\)正确?因为我们已经固定住不移动的数,那么剩下的数要么向左移,要么向右移,如果它比\(A[i]\)大,那么它一定要往右移.如果它不往右移,那么一定要往左移.
最后为了写代码方便,我们可以设一个哨兵,令\(A[n+1]=n+1\),将它变成最大的数,于是它就会把前面的答案收集过来.
P2150 [NOI2015] 寿司晚宴
思路:
想到可以将质数分开两个集合,然后状压一下.发现只能过\(n\leq 100\)的点,疯狂考虑优化,想到如果质数大于\(n/2\)那么只会有它本身包含这个因数.这样\(n\leq 200\)的点勉勉强强应该能过了.
考虑只状压\(\sqrt n\)的质数,因为\(1..n\)内的数分解质因数最多只有一个数\(x\)大于\(\sqrt n\),所以我们可以将这些数按照\(x\)排序,这样题目变成了\(l[i]..r[i]\)内的数不能同时放在一个集合内,而且这些区间是不会相交的,相当于我们可以做一个分组背包.
时间复杂度为\(O(n2^{16})\).
AT4378 [AGC027D] Modulo Matrix
思路:
这道题着实吓人,其实我们可以构造特殊情况也就是\(max(x,y)\%min(x,y)=1\),那么我们其实可以隔着一个点先填数,那么剩下的数,我们只要求它周围的数的\(lcm\)再加\(1\).
那么现在还剩下一个问题,就是如何防止填的数相等,对于一个数我们可以分成若干个质数相乘,考虑一个格子\(i,j\)我们可以填\(A[i]*B[j]\),\(A\),\(B\)序列分别是不同的质数.
CF476D Dreamoon and Sets
思路:
我们可以转化一下题目,将每个四元组内的数除以\(k\),那么我们只需要构造\(n\)个四元组,里面的数是互质的即可.对于每\(6\)个数中我们只会选择\(6x+1,6x+2,6x+3,6x+5\)这一定是最小的,而且这还满足互质的条件.
P5361 [SDOI2019]热闹的聚会与尴尬的聚会
思路:
一看\(p\),\(q\)之间的限制感觉很奇怪,这必然存在一个性质,我们发现\(n+1\leq (p+1)*(q+1)\),观察\(p\)的求法,对于每对好友我们可以连一条边,我们可以构造一种方案,每次将还在集合数里的人边数最少弹掉,再将与它所有相邻的点删掉,那么这时的\(p\)为我们弹出的人的边数,而\(q\)为我们弹出的人数.那么我们可以得到一个等式\(\sum_{i=1}^{q}(d_i+1)=n+1\),\(d_i\)表示一个点的度数,那么可以知道至少存在一个\(d_i\)满足\(n+1\leq (d_i+1)*(q+1)\).
CF1349D Slime and Biscuits
思路:
好家伙,势能函数
简单来说就是每操作一步,势能就会减小\(1\),那么答案就是初始的势能减去最终的势能.
设势能函数为\(f(a_i),m=\sum_{i=1}^{n}a_i\).那么我们可以列出操作一步的等式:
\(\sum_{i=1}^{n}f(a_i)=1+\sum_{i=1}^{n}\frac{a_i}{m}(f(a_i-1)+\sum_{j=1}^{n}[j\not = i]f(a_j+1)*\frac{1}{n-1}+\sum_{j=1}^{n}[j\not = i]f(a_j)*\frac{n-2}{n-1})\).
化简式子得\(f(a_i)=(\frac{a_i}{m}*(f(a_i-1)+1)+\frac{(m-a_i)}{m(n-1)}f(a_i+1)+\frac{(m-a_i)(n-2)}{m(n-1)}f(a_i+1))\).
显然\(f(0)=0,f(1)=0\),那么我们可以递推求解.
最终答案为\(\sum_{i=1}^{n}f(a_i)-(n-1)f(0)-f(m)\).
CF547D Mike and Fish
思路:
一眼就想到二分图染色.显然我们对于同一水平线的两个点连一条线,同时将这两个点在这个水平线上删除,再对同一垂直线上的两个点连一条线,再将它们在这个垂直线上删除.这样构造一定有解,因为一个点最多连两条边,最多产生一个长度为\(4\)的偶环.
CF547E Mike and Friends
思路:
可以用广义\(SAM\)+线段树合并实现.当然我要讲的是\(AC\)自动机.
显然我对这么多串建一个\(AC\)自动机,根据\(fail\)建立一棵树,那么我们对询问作一个差分,我们加入一个串\(S\)时,可以在它每个前缀对应的节点上的贡献\(+1\),那么答案就是查询串\(T\),在\(fail\)树上对应节点的子树上节点贡献和.
P3557 [POI2013]GRA-Tower Defense Game
思路:
一道有意思的构造题.
肯定都猜到结论就是随便从一个点出发,需要建塔的位置就建塔.
假设我这个点原来是不放塔的,那么这个塔的旁边必然会被放上一座塔.现在我在这个点上放了一座攻击距离为\(2\)的塔,那么它能覆盖的位置肯定是不小于旁边这座塔的.
P2474 [SCOI2008]天平
思路:
考试打了将近\(4kb\)的大模拟,人傻了分还少.
对于这种三角式的约束条件,我们通常用差分约束系统来解决.
根据题目给的条件,我们可以转化成不等式,\(mx[i][j],mi[i][j]\)分别表示\(i-j\)的最大值和最小值.我们可以利用\(floyd\)计算出来每个\(mx[i][j],mi[i][j]\),最后暴力枚举两种砝码,比较一下即可.(值得思考的是两个差值应该是独立的)
P6868 [COCI2019-2020#5] Matching
思路:
(大致讲一下思路,题意有点问题,具体看Most_handsome的题解)
通过画图可知,我们可以先处理那些只有一个点裸露的,因为那样的点只有一种选择方案.
通过上面的处理,我们剩下来的会是好多个环,这些环里有特殊的,就是被我们之前取得线段经过的,那么可以发现整个环就只有一种取法.一直这样重复处理.
最后那些剩下来的环,我只要都横着取或者都竖着取,就可以毫无干扰了.
具体讲一下处理环的部分,我们用线段树维护一个线段的\(x\)部分,在线段树的每个节点处开一个\(set\)维护线段的\(y\),这样我们一开始将所有线段都放进去,我们每选择一个线段,就将它丢进队列里,每次取出一个队头元素,在线段树上寻找它能限制哪些线段,如果限制的线段我们已经取过了,那就说明无解.否则一直重复取下去.
思路较简单,代码很恶心
P7207 [COCI2019-2020#3] Sob
思路:
又是一道离谱的构造题.
首先题目说明,保证有解.
想到缩小问题规模,我们选取\(A\)中的后面\(x\)个和\(B\)中的前\(x\)个进行匹配.
我们找到最小的\(x\),这样就可以保证\(n...n-x+1\)与\(m+x-1...m\)一一匹配.感性理解一下,我也不会具体证
#3140. 「COI 2019」TENIS
思路:
一道有意思的线段树题.
#3137. 「COI 2019」IZLET
思路:
一道神奇的瞎搞题.
P6885 [COCI2016-2017#3] Zoltan
思路:
一道神奇的\(LIS\)题目,这个长度相信大家都会求解,就是以\(1\)为分界线,我们将要就求解的\(LIS\)划分为两部分,\(1\)左边坐标下降,\(1\)右边坐标上升.那么我们可以倒着加点依然用树状数组维护\(LIS\).
那么方案数该如何求解?如果暴力写法就是这样:
if(y.Mx>Mx)Mx=y.Mx,sum=y.sum;
else if(y.Mx==Mx)add(sum,y.sum);
我们只需要将这一套搬到树状数组上就行了.树状数组nb 具体实现可以看一下代码.
P7796 [COCI2014-2015#7] POLICE
思路:
看到这道题书本移来移去我头都痛了
写这道题时想到上面某道题,发现那些不移动的书构成一个最长上升子序列,这时我猜了一个小结论:每本书只会移动一次.当然这是错的,然后就弃了.
什么时候会移动两次?就是当这些书架上的书都满了,此时你需要先丢掉一本书到另一个空位上.那么需要哪些书架上的书满了才行呢?当然是你这些书架上的书相互之间移动,那么此时你不能拿任何一本书进行一步到位.
这样我们就可以建图,对于一本书从书架\(x\)移动到书架\(y\),我们将\(x\)与\(y\)之间相互连边,那么我们就得到了若干个联通块.
对于每个联通块来讲:如果这个联通块上至少有一个书架的位置有空余,那么我们显然可以让跟它连边的书架上面的书一步到位,这样一直消边,最后就移动完了.反之我们就需要一个额外步数.
注意:如果所有书架上的书都满了,我们需要特判一下.因为上面的移动过程我们都默认有一个空书架.