2017.11.6 Problem A
题目大意:nnn个人围成一个环,编号为111 ~ nnn,从111号开始从111报数,每次报到mmm时,报111 ~ m−1m-1m−1的人出列,下一个人继续报111,问最后留下的人的编号。保证m−1∣n−1m-1|n-1m−1∣n−1。
做法: 本题需要用到递归。
nnn个人进行这个游戏的话,如果就这样顺着报下去,那么剩下的就只有编号为mmm的倍数的人和最后n%mn\%mn%m个人,相当于把后n%mn\%mn%m个人移到前面,然后做一个⌊n/m⌋+n%m\lfloor n/m\rfloor+n\%m⌊n/m⌋+n%m个人的子问题,递归求解即可,时间复杂度约为O(logmn)O(\log_m n)O(logmn)。
2017.11.6 Problem B
题目大意: 对一个111~nnn的排列AAA进行一种排序,步骤是每次枚举数对(i,i+X)(i,i+X)(i,i+X),如果Ai>Ai+XA_i>A_{i+X}Ai>Ai+X则交换这两个数,直到没有满足要求的数对为止。问有多少种XXX能使这个排列最后能排成升序,并求出这些XXX。n≤500000n\le 500000n≤500000。
做法: 本题需要用到问题转化+gcd。
注意到,AiA_iAi能排到原来位置的充要条件是i≡Ai(mod X)i\equiv A_i(\mod X)i≡Ai(modX),这意味着XXX是∣i−Ai∣|i-A_i|∣i−Ai∣的因数,因为要满足所有这样的条件,那么我们求所有∣i−Ai∣|i-A_i|∣i−Ai∣的最大公因数,那么可行的XXX就是这个最大公因数的所有因数。时间复杂度为O(nlogn)O(n\log n)O(nlogn)。
2017.11.6 Problem C
题目大意: 一个国家有若干个城市坐落在数轴的非负整数点上,首都为000,每个城市有一个车站,有nnn列火车从首都开出,并到达一个目标城市SiS_iSi,中间任意车站都可以停靠,而每列火车都有一个能容纳乘客的量CiC_iCi。有mmm个乘客要乘车,第iii个乘客要在LiL_iLi站上车,在RiR_iRi站下车,问在不超过火车容量限制的情况下,最多能满足多少名乘客的乘车需求。
做法: 本题需要用到贪心,然而我并不太会,原题应该是CQOI2016的。
2017.11.7 Problem A
题目大意: 在一个n×nn\times nn×n的透明玻璃片上的每一个1×11\times 11×1的小格涂上颜色,如果一个涂色方案使得这个玻璃片无论如何旋转、翻转,看起来都和原来一样,那么这个图被称作回文图,而现在有mmm个小格已经被涂上了颜色,颜色共有kkk种,问有多少种涂成回文图的涂色方案。
做法: 本题需要用到置换映射+组合计数+快速幂。
仔细分析一下,一个格子(x,y)(x,y)(x,y)(坐标值均为000~n−1n-1n−1之间的数),无论经过多少次旋转、翻转操作,最后转移到的点的坐标只有888个:(x,y)(x,y)(x,y),(n−1−x,y)(n-1-x,y)(n−1−x,y),(x,n−1−y)(x,n-1-y)(x,n−1−y),(n−1−x,n−1−y)(n-1-x,n-1-y)(n−1−x,n−1−y),(y,x)(y,x)(y,x),(n−1−y,x)(n-1-y,x)(n−1−y,x),(y,n−1−x)(y,n-1-x)(y,n−1−x),(n−1−y,n−1−x)(n-1-y,n-1-x)(n−1−y,n−1−x)。可以证明这888个坐标经过旋转、翻转之后仍然在这888个坐标之内,那么我们把这样的888个坐标的集合体叫做等价类,根据回文图的定义可知,同一个等价类内的格子只能涂同一种颜色。那么问题转化为求有多少个等价类可以随便涂色,因为已经有mmm个格子已经被涂上颜色了,那么这些格子所属的等价类也相当于被涂上颜色了,O(m2)O(m^2)O(m2)判定一下这mmm个格子的限制使得多少等价类受到限制即可。n×nn\times nn×n方阵中总的等价类数应该为⌊n+12⌋(⌊n+12⌋+1)2\frac{\lfloor \frac{n+1}{2}\rfloor(\lfloor \frac{n+1}{2}\rfloor+1)}{2}2⌊2n+1⌋(⌊2n+1⌋+1)(这个自己想想应该就能明白了吧),用这个数减去受限制的等价类数就是能任意涂色的等价类数了,令这个数为ppp,那么答案显然为kpk^pkp,用快速幂求出即可,时间复杂度为O(m2+logn2)O(m^2+\log n^2)O(m2+logn2)。
2017.11.7 Problem B
题目大意: 一棵树有nnn个点,每个点可能是白色或黑色,问有多少种分割方法,使得分割后的每个连通块内有且仅有一个黑色点。
做法: 本题需要用到树形DP。
令f(i)f(i)f(i)为在以iii为根的子树中切割,使得iii所在的连通块内不含黑色点,其余连通块都含一个黑色点的切割方案数,g(i)g(i)g(i)为在以iii为根的子树中切割,使得每个连通块内都含且仅含一个黑色点的切割方案数,那么有状态转移方程(下列jjj表示iii的所有儿子):
如果点iii为黑色点:
f(i)=0f(i)=0f(i)=0
g(i)=∏j(f(j)+g(j))g(i)=\prod_j(f(j)+g(j))g(i)=∏j(f(j)+g(j))
其中g(i)g(i)g(i)的式子可理解为,对于iii的每一个儿子,要么选择连接iii与这个儿子的边,这样的话方案数为f(j)f(j)f(j),要么选择断开iii与这个儿子的边,这样的话方案数为g(j)g(j)g(j)。
如果点iii为白色点:
f(i)=∏j(f(j)+g(j))f(i)=\prod_j(f(j)+g(j))f(i)=∏j(f(j)+g(j))
g(i)=∑jg(j)∏son≠j(f(k)+g(k))g(i)=\sum_jg(j)\prod_{son\ne j}(f(k)+g(k))g(i)=∑jg(j)∏son=j(f(k)+g(k))
其中g(i)g(i)g(i)的式子也可写成g(i)=∑jf(i)f(j)+g(j)g(j)g(i)=\sum_j\frac{f(i)}{f(j)+g(j)}g(j)g(i)=∑jf(j)+g(j)f(i)g(j),用逆元算出,然而也可以直接算上面的式子,具体计算方法见代码。
那么最后的答案显然为g(root)g(root)g(root),总的时间复杂度为O(n)O(n)O(n)(用逆元的话会退化到O(nlogn)O(n\log n)O(nlogn))。
2017.11.7 Problem C
题目大意: 一个nnn个点mmm条边带边权的无向连通图,qqq个询问,每次询问两点之间的最短路径长度。有444类数据:1.n≤1000,n−1≤m≤1200n\le 1000,n-1\le m\le 1200n≤1000,n−1≤m≤1200。2.m=n−1m=n-1m=n−1。3.m=nm=nm=n。4.m>nm>nm>n,每条边最多在一个环上。
做法: 本题主要用到LCA。
对于第一类数据,暴力跑nnn遍SPFA即可,时间复杂度约为O(nm)O(nm)O(nm)。
对于第二类数据,所给图为一棵树,根据dis(a,b)=dis(root,a)+dis(root,b)−2dis(root,lca(a,b))dis(a,b)=dis(root,a)+dis(root,b)-2dis(root,lca(a,b))dis(a,b)=dis(root,a)+dis(root,b)−2dis(root,lca(a,b)),在线倍增或离线Tarjan求出LCA即可,时间复杂度为O((n+q)logn)O((n+q)\log n)O((n+q)logn)或O(n+q)O(n+q)O(n+q)。
对于第三类数据,所给图为一棵环套树,那么我们可以先找环,然后如果a,ba,ba,b在同一棵外向树中,直接按照第二类求即可,否则找到它们所在外向树的根,它们之间路径的最短路就是它们各自到外向树根的距离之和+这两个根在环上的最短路。时间复杂度为O((n+q)logn)O((n+q)\log n)O((n+q)logn)或O(n+q)O(n+q)O(n+q)。
对于第四类数据,所给图为一个仙人掌,然而我不会圆方树之类的奇妙数据结构,故不会做,原题应为BZOJ2125。