即使如此,jz姐姐也漂亮的取得了胜利
有些懒得写直接口胡,所以代码也不一定有
暂时停更了
2015-2016 Petrozavodsk Winter Training Camp, Makoto rng58 Soejima Сontest 4题解
被(jz)姐姐带着飞……
(A)
发现这样的数不会很多,直接把所有的都打表打出来就行了
(B)
转换成切比雪夫距离后,每个点分别向(x,y)坐标最大最小的点连边,跑个最大生成树就行了
(C)
最终的柿子一定行如(spm t=2a_{i_1}-2a_{i_2}+...),那么直接(bfs)出所有可能的结果,然后根据奇偶性判断一下就行了
(D)
唯一会重复计数的地方,就是把两个相同的公共子串拼在一起,我们把一个由两个相同公共子串拼在一起的串称为(jz)串。为了避免重复计算,由于(jz)串中每个数字都会出现恰好两次,我们默认先出现的那个来自于(p),后面那个来自于(q)
设(g_k)表示由一个长为(2k)的(jz)串,且不存在一个前缀也为(jz)串,显然(g_k=C_k-sum_{i=1}^{k-1}g_iC_{k-i}),其中(C_k)表示第(k)个卡特兰数
ps:因为不存在一个前缀为(jz)串,等价于不存在前缀和为(0),那么把第一个左括号和最后一个右括号去掉之后仍是一个合法的括号序列,所以(g_k=C_{k-1})
然后我们设(f_{i,j})表示(p)取到了([1,..,i]),(q)取到了([1,...,j])的方案数,首先有(f_{i,j}=f_{i-1,j}+f_{i,j-1}),然后考虑减去重复的,枚举每一个(k)使得(p[i-k+1,...,i]=q[j-k+1,..,j]),那么(f_{i,j}-=f_{i-k,j-k} imes g_k)(因为长为(2k)的(jz)串中默认前面的为(p)或者(q)是等价的,而直接(dp)的过程中认为它们不等价),而且不难发现对于所有的((i,j))总共要枚举的(k)只有(O(n^2))个,所以总复杂度为(O(n^2))
(E)
(sort)一遍,然后记(f_i)表示用了(i)个蛋糕之后的最小重量,直接(dp)即可
(F)
首先等式相当于对于(a_i)整除分块之后,每一种颜色在同一块里,那么不同({a_iover x})的个数只有(O(sqrt{a_i}))个,那么把所有的(x)都取出来,形成若干段,对于每一段依次判断是否合法即可
(H)
考虑容斥,如果没有重复经过点就是(4^n(n+1))
重复经过点一定是走了一个环,且如果走环的时候没有重复经过点,则一个环就唯一对应多走的一次,我们枚举环的长度(i)以及在环上(n-i+1)个点中的哪个开始绕圈即可
设(f_k)表示走了(k)步成环,可经过重复点的方案数,则(f_n=sum_{i=0}^{n/2}{n!over i!i!(n/2-i)!(n/2-i)!}=sum_{i=0}^{n/2}{n/2choose i}{n/2choose i}{nchoose n/2})
那么(g_n=f_n-sum_{i=1}^{n-1}g_if_{n-i})
最终的答案就是(4^n(n+1)-sum_{i=1}^n g_i(n-i+1))
(I)
首先把每个机器人所在的点拆成四个,分别表示四个方向,记为((u,L/R/D/U))。如果存在(x_i<x_j)且(y_i=y_j),那么从((i,R))向((j,R))连一条边,边权为(x_j-x_i),表示如果有机器人从右边进入(i),那么可以继续进入(j)。然后对于拆出来的点,将表示其他方向的点向表示这个机器人朝向的点连一条长度为(0)的边,表示如果其它机器人从另一个方向进入(i),可以使(i)从自己所朝的方向出去。跑一个最短路,求出(dis)表示每个机器人动起来的最早的时间即可
(J)
度数限制,(Prufer)序列搞一搞就行了
(K)
这道题等价于求出一组模长相等的正交基,使得它可以整系数线性表示出所有的差向量,且点数最少意味着这组正交基模长最长,所以对于所有的差向量求一个(gcd),然后算出算出最小的边长就是了
不要问我向量gcd是什么能用就行
(L)
直接模拟就行了
(M)
如果(n)为奇数,直接枚举(d)从(1)到(n/2),每次将(i,i+d,i+2d)连边((n)个一循环)
如果(n)为偶数,对(1)到(n-1)枚举(d)从(1)到(n/2-1)做一遍上述操作,再枚举(d)从(2)到(n/2-1)做一遍,然后以(n-1)个一循环,将每个((i,i+1,n))连两条边,将((i,i+2,n))连一条边就行了
2016 North American Invitational Programming Contest题解
极度自闭,前三个半小时做到只剩两道题,结果被(G)彻底卡住,我和(jz)姐姐两种写法全都死得莫名其妙,心态彻底炸裂
(A)
咕咕
(B)
大模拟
(C)
状压,设(f_{i,j})表示用了(i)种纸覆盖了集合(j)的纸的最小代价,转移就是枚举子集,那么新用的纸肯定是取这个集合的所有纸里最大的长和宽是最优的,转移即可
(D)
分数规划+必须有上司的舞会
(E)
把原串(B)记为(1),(A)记为(0),再翻转之后(A)记为(1),(B)记为(0),(NTT)就行了,卷积之后第(n-1-i)项系数就是题中(i)的答案
(F)
直接跑背包就行了,最后减去所有相等的方案
(G)
道心崩碎了
不难发现如果两条线段有相同的中点或者中垂线的话,这两条线段一定没有公共端点,那么我们对于所有的中点和中垂线计算出现次数,取出现次数最大的就行了
然而上面忽视了一个地方,如果有很多个点在同一条直线上,完全可以以这条直线为对称中心的线,上面完全没有考虑这种情况
(H)
分治背包,记(f_{i,j})表示体积不超过(i),总容量不超过(j)的最大收益,然后对于当前体积(s)将(j)按模(s)分组,组内有决策单调性,分治即可
(I)
直接(O(nlog n))枚举所有点对就行了
(J)
先填完,然后从后往前枚举时间点,黑白用(set)维护
(K)
点分之后,两颗不同子树中每个点可以看成((a_u,dis_u),(a_,v,dis_v)),而贡献就是(a_ua_v+dis_u+dis_v),那么对于(u)来说所有的(v)都可以看成一个一次函数,直接超哥线段树维护就行了
2017-2018 Petrozavodsk Winter Training Camp, Saratov SU Contest题解
双双归西
(A)
把所有的(a,b,c)放到一起排序,然后枚举最小的是哪个,那么可行的是一个区间,数一数这个区间里来自另外两个序列的数的个数即可
(B)
组合数学水题,鉴于高精要用python所以不写了
(C)
考虑如果是在直线上,那么我们每一次取最靠左的右端点,然后取了这个右端点,并删掉所有包含它的然后继续。这里也类似贪心,只不过每次选LCA深度最大的就行了
(D)
首先对于某个(i),如果存在(t_jgeq t_i)且(a_jgeq a_i),那么显然不用考虑(i)了(因为完全可以让(j)带着(i)飞)
那么我们用单调栈把所有有用的取出来,记(f_i)表示前(i)个做完的答案,设(k=min{j,t_j>f_i}),那么(i)可以转移到任意(jgeq k),且转移为(f_j=min(f_j,t_j+max(i+1,...,j))),柿子与(i)无关,且由于之前的预处理有(a_i>a_{i+1})恒成立,且可以转移的是一段后缀,那么只要在位置(k)上打个标记,扫到的时候取出就行了。
另外除此之外唯一可以转移的地方是(k-1),特判一下就行了
(E)
合法的必要条件,就是(A)无入边,(B)无出边,除了这两个点之外的点既有入边又有出边
然后从(B)向(A)连两条边,这样我们可以使其只有度数限制。这样,一个选(S_A)的方案合法,当且仅当每个点有且仅有一次作为出点,选(S_B)同理
这样的话,我们可以建一个二分图,左边(2n)个点,表示每个点被选为入点/出点,右边(m)个点,表示每条边,这样二分图的一个完美匹配就是一个合法的方案了,跑个(dinic)就行了
然后在评论里还看到一种方案,就是把右边的点当成边,这样一个完美匹配可以看成一个边覆盖,一组方案合法当且仅当每个连通块都满足点数(=)边数(就是基环树),用类似(Kruskal)的东西搞一下就行了
(F)
随机取一个数,它不在最终的集合中的概率是({kover n}),那么随机取数,计算出这个和其它所有数的(gcd),然后从大到小枚举每一个(gcd)并将所有出现次数大于它的(gcd)的出现次数加起来,最后判断是否可行。记得加几发剪枝
(G)
二分+差分约束,注意精度,建议开 long double
(H)
由于没有度数为(2)的点,我们可以每次询问(S(Tackslash {u}))来判断(u)是不是叶子,然后随便取一个叶子为根,对于每一个叶节点(u)和非叶节点(v),询问根,(u)和(v),那么(v)是(u)的祖先当且仅当询问结果为(3),对于某个(u)来说,将它的所有祖先按子树内叶子个数排序,由于不存在度数为(2)的节点,所以这个顺序就是祖先的(dep)的顺序了,最后(dfs)一遍就行了,顺便因为我们之前连了很多重边所以(dfs)的时候要用(vis)判断
(I)
如果把每个点向它的最长前缀连边,没有前缀的点向(0)连边,那么以(0)为根搞个树形(dp)就行了
连边的话,先把串反过来把前缀变后缀,然后对于所有子串从小到大考虑,每个子串在(parent)树上倍增找到对应的点,然后对子树区间覆盖来更新最长前缀。顺便注意处理两个子串相同的情况
(J)
分治背包,每一层回答所有跨过(mid)的询问,预处理之后可以每次(O(m))回答询问,总复杂度(O(nmlog n+qm))
(K)
对原串建(SAM)并用线段树合并和(endpos)集合搞出来,然后设个阈值(L),如果询问串长度大于等于(L)那么直接贪心并暴力在线段树上找下一个合法位置,否则把所有长不超过(L)的串扔到(trie)上搞一搞,询问的时候直接在(trie)上匹配就是了
(L)
把所有在最短路上的边取出来,跑个支配树就行了
2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest题解
彻·底·爆·炸
这一次曲明头顶黑锅,锅都是我的jz姐姐不要抢
(A)
相当于是被若干个行向量表示出来,那么等价于求矩阵的秩,注意精度
(B)
根据jz姐姐的初中知识,我们只要对于每个圆,把它和其它圆的根轴作为分界线就行了,根据蒙日定理这是正确的,那么枚举每个圆,把其它所有圆取出来做半平面交就行了
(C)
把所有没有被覆盖的角度的范围取出来,找到没有被覆盖的最大值,取那一段中点的角度,然后画个半径(10^9)的圆就行了。我写的(WA)了,jz姐姐照着我的写了一遍就(A)了……
(D)
好难不会,jz姐姐会
(E)
如果(a,b)之间有祖先关系显然(gg),否则我们找到(lca),从(a,b)开始暴力跳上去,把所有另外的子树全都选了即可
(F)
树上莫队+bitset优化就行了,用bitset的_Find_first()函数
(G)
连一个(2k)个点的完全图,枚举(i),然后令(j)从(1)到(k)并从(i)到(i+j)连边,然后枚举(j)从(k+1)到(2k-1)从(i+k)向(i+j)连边
(H)
答案即为
鉴于不能取模会炸,所以把所有的乘法运算全都取(ln)
(I)
先用单调栈求出每个点往左往右最远能扩展多少,对于询问,先求出区间内最大值出现的最左和最右的位置,记为(L,R),那么一种可能是答案就是(R-L),另一种情况是答案在([l,L-1])或([R+1,r])中,以([l,L-1])为例,此时向右一定不可能扩展出(L)的范围,那么我们只要查询这个区间内能向右扩展的最大值即可,([R+1,r])同理
(J)
一开始(zz)的写了个点分+hash,后来被jz姐姐调教一通之后发现直接(dfs)并在节点处合并链就行了
具体来说就是对于每个节点记一下往下最深能匹配多长的前缀和多长的后缀,然后两条链合并一下
(K)
如果有度数为奇数的点,(gg)
否则如果所有点度数小于等于(2)(即为环),那么全都合法
如果只有一个点度数大于(2),那么只有它有可能可行,把它从图中去掉,剩下的必须不能成环
如果有两个点度数大于(2),枚举这两个点
否则只有度数最大的点可行,而且如果有多个度数最大的点(gg),否则判断一下度数最大的点是否可行即可
2013-2014 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest题解
肝了整整三个小时的假算法……不用说了这场锅全都是曲明的……
(A)
离线,把询问挂到右端点上,那么发现(mex)要么是(1)到(r)中没出现过的数里最小的,否则对于每个数我们只需要考虑它出现的最右边的位置,从左往右扫,当扫到(r)的时候把(a_r)在线段树上设为(a_r),并把它上一次出现的位置的值设为(inf),然后处理(r)处的所有询问,只要查询([1,l-1])的最小值即可
(B)
如果暴力枚举所有角度就凉了,我们发现(B)和(D)可以对称地枚举,于是只要枚举(∠BAC),(∠BCA),(∠ABD)即可,其他的关于(B)的角度就知道了(三角形内角和),同样的(D)也有这些角度组,发现只要(∠ABD+∠BAC)和(∠DCA+∠ADB)相等以及(BD)与(AC)的交点(M)满足以上条件就是合法的(即共线),于是存下这些角度组,交点利用长度维护,即(AMover CM),这应该在(B)的角度组中和(D)的角度组中恰为倒数。但有几个精度问题,比如存长度和角度这里建议使用(sin),同时因为有倒数操作,精度会炸,所以建议取对数,然后就过了。
(C)
首先为了方便,不妨假设(|B|<|D|),并假设(B+T=rev(D)),那么显然(T)是个回文串,而且可以发现(T)越长越好
我们枚举回文中心,用(manacher)跑出该回文中心的最长回文串,假设为([l,r]),那么我们就要找到最大的(i)满足(rev(s[r+1,i]))是(s[1,l-1])的子串,记(t=rev(s)),则(t[i,n−r])是(s[1,l−1])的子串。我们把询问给离线,把(s)和(t)建在同一个广义(SAM)里,在(s)里从左到右扫,每一次把(i)在(parent)树上所有祖先全都标记,表示(i)的所有后缀都合法了,那么从(1)到(i)扫完相当于把(s[1,i])的所有子串都给标记了。值域前面那个,我们把(t[n−r])这个询问丢到(s[l−1])这个位置,标记完之后,相当于查询(t[n−r])的父亲中第一个合法的值,查到之后就可以更新答案了。发现上述操作利用在(parent)树上树剖+线段树即可
(D)
jz姐姐半个小时才颓出柿子,你告诉我这是道签到题?
枚举回文串长度,如果为(i),那么贡献就是就是(k^{i/2}(n-i+1)),由于越往后精度越差所以(i)最多枚举到(1000)就差不多了
(E)
本来想试着把这题推广到二维,然后jz姐姐一说才发现二维就是个思博题
根据欧拉公式,有(V-E+F=2),那么在期望意义下也是如此,由于不存在四点共面(就算有我们也可以通过扰动使它没有),所以我们枚举凸包上某个点对应的三个顶点,这个面在凸包上当且仅当它左边的点全都不出现,那么计算出每个面出现的概率加起来就是期望面数了,由于每个面有恰好三条边所以期望边数就是({3over 2}F),那么期望点数就是(2+{1over 2}F)了
好了吗?才~~怪~~
我们发现一件事情,我们考虑的(F)是凸多面体的面,所以在(0,1,2)的时候是没有被考虑的,也就是说我们多算了
如果(V=0),那么(E=0,F=2),但是这里你认为(F=E=0),所以你多算了个(2)
如果(V=1),那么(E=0,F=1),但是这里你认为(F=E=0),所以你多算了个(1)
如果(V=2),那么(E=1,F=1),但是这里你认为(F=E=0),所以你多算了个(0)
这些要减掉才是正确答案
(F)
写出转移方程,设(dp[i][j])表示当前以(i)结尾以(j)开头的最小代价,转移就是(dp[i][j]=dp[j-1][k]+(s[i]-s[j-1])ast (s[j-1]-s[k-1])),斜率优化就行了
(G)
如果我们固定左端点,那么当(R)不断右移的过程中,答案有时会(+1),如果(+1)我们就认为这个字符会出现在(LCS)的所有方案中。而且我们发现如果固定了右端点,那么使这个字符会出现在(LCS)所有方案中的左端点是一段区间
设(h[i][j])表示考虑了(s[1,..,i]),且(t)中的右端点固定为(j)时,当(Lin (h[i][j],j])时,(t[j])一定出现在(LCS(s[1,...,i],t[L,...,j]))的所有方案中
设(g[i][j])表示考虑了(s[1,..,i]),且(t)中的右端点固定为(j)时,当(Lin [1,g[i][j]])时,(s[i])一定出现在(LCS(s[1,...,i],t[L,...,j]))的所有方案中
边界条件为(h[0][i]=i,g[i][0]=0)
考虑转移
如果(s[i]=t[j])
-
对于(h[i][j]),考虑当(i)和左端点固定,右端点从(j-1)移动到(j)时,(LCS)增加了(1),也就是不存在一种不使用(s[i])的(LCS(s[1,..,i],t[1,..,j-1]))的方案。而如果不出现这样的情况,当且仅当(LCS(s[1,..,i],t[1,..,j-1]))的所有方案都用到了(s[i]),所以有(h[i][j]=g[i][j-1])
-
对于(g[i][j]),同理可得(g[i][j]=h[i-1][j])
如果(s[i] eq t[j])
-
对于(h[i][j]),为了让(t[j])一定进入(LCS),此时(LCS(s[1,..,i],t[1,...,j]))的方案也是(LCS(s[1,..,i-1],t[1,...,j]))的方案,所以有(h[i][j]geq h[i-1][j]),但是从(i-1)移动到(i)有可能会改变(LCS)的大小,所以(s[i])一定不能出现在(LCS(s[1,...,i],t[1,...,j-1]))中,因此还需要(h[i][j]geq g[i][j-1]),于是有(h[i][j]max(h[i-1][j],g[i][j-1]))
-
对于(g[i][j]),同理可得(g[i][j]=min(h[i-1][j],g[i][j-1]))
(dp)求出所有(h,g)之后,我们固定左端点,并不断移动右端点,每次(h[n][R]<L)时令(LCS)加一即可
(H)
咕咕
(I)
咕咕
(J)
先考虑最终的平面图,然后把平面图拆环,倒序处理询问,每次相当于把两个环给合在一起,用并查集处理就行
(K)
树剖之后,每个修改可以看成是对指向父亲的边的修改和指向儿子的边的修改,如果是指向父亲的边,直接在暴力跳重链然后在线段树上更新即可,而在切换重链的时候,我们不直接修改轻边,而是记一个(to_u)表示对(u)的所有轻儿子的边进行修改。另外这里还需要一棵线段树用来维护所有这种标记的时间戳,用来判断这种操作和上面那种操作谁先谁后
2018-2019 ACM-ICPC, Asia East Continent Finals
曲明一个人承包了全队的罚时
(A)
由于边权很小,我们依次枚举(s_{i,j})表示只考虑边权小于等于(j)的边,前(i)阶图里的边数,那么贡献就是(j imes (s_{i,j}-s_{i,j-1}))
那么我们假设现在已经确定了要连的边,如何确定最终能连的边数,对于第(1,2)两列,我们直接用并查集维护一下就能算出能连的边数了,假设我们现在已经算出来第(i)列和第(i-1)列需要连的边数,考虑如何计算第(i)列和第(i+1)列之间的边数
要算边数,我们就需要并查集,假设现在有一个长度为(2n)的并查集表示第(i-1)列和第(i)列的连通关系,那么对于第(i)列和第(i+1)列的连通关系,肯定是在这个基础上再多连通几个。而这里的多出来的连通,是由于第(i)列自己内部产生的一些新的连通关系导致的。所以我们把所有从(i-1)推到(i)列时内部产生的新的连通关系记录下来,那么在从(i)推到(i+1)的时候,只需要用这些来更新新的连通关系就行了
由于(2n)个点连的总的边数不会超过(2n-1),所以这里的复杂度就是(O(nalpha(n)w))
(B)
显然可以转化为数不同的析合树个数
记(f_i)表示(i)个叶子的不同的析合树个数,(dp_{i,j})表示(i)个叶子构成(j)棵析合树的方案数,转移就是讨论根节点是合点还是析点
如果根节点是合点,那么至少要有两个儿子,所以(f_i+=sum_{kgeq 2}dp_{i,k})
如果根节点是析点,那么至少要有四个儿子,所以(f_i+=sum_{kgeq 4}dp_{i,k})
综上,即(f_i=dp_{i,2}+dp_{i,3}+2sum_{kgeq 4}dp_{i,k})
而(dp)的转移就是个普通的卷积,即(dp_{i,j}=sum_{k=1}^{i-1}dp_{i-k,j-1}f_k)
发现这些都能用前缀和预处理转移,那么我们枚举(i),然后记(g,h,p)分别表示(k=2,k=3,kgeq 4)的方案数,转移就行了
(C)
发现(4,9,25,49)的倍数的位置一定是(0),那么我们枚举开头模这些数的(lcm)的余数,然后判断对应位置是否合法,依次作为剪枝来得到“可能”合法的开头余数,然后再用余数来枚举对应的开头,(check)的时候只要把(1)到(sqrt{10^9})的所有质因子的平方打表打出来,用类似分块埃筛的方法在对应区间筛一下就行了,最后加个卡时判无解
(D)
判断(n,m)哪个大
(E)
不会,jz姐姐会
(F)
如果线段和求没交就是线段长,没交当且仅当点到直线距离大于等于(r)或者(ost)或者(ots)是钝角,否则就是从点到圆做切线再跑完剩下那段球面
(G)
咕咕
(H)
咕咕
(I)
发现给(A)升级贡献要乘上剩余攻击次数,给(D)升级贡献要乘上剩余攻击总时间-当前时间*剩余攻击次数,那么我们记(f_{i,j,k})表示考虑完前(i)轮,剩余攻击次数为(j),剩余攻击总时间为(k)的方案数,直接dp即可
(J)
首先把原串倒过来,那么问题就是给每个前缀一个(p_i),一个前缀的价值为它和其它所有前缀的(lcs)乘上那个前缀对应的(p_i),求一种方案使得价值最小的前缀价值最大
建出(parent)树之后,问题可以转化为对于每个前缀代表的点,令它到根节点路径上每个节点的权值加上(p_i),一个前缀的价值就是它代表的节点到根节点路径上的每一个节点的权值*长度之和
我们发现对于两个前缀,如果(u)在(parent)树上是(v)的父亲,那么(v)显然是没有用的(因为(u)的价值一定比(v)小),这样删去没用的节点,所有前缀的节点就都是叶子了
然后问题可以转化成一棵树,每个节点儿子的权值之和等于它的权值,根节点权值为(1),叶子节点的代价为它到根节点的路径上所有节点权值之和,最大化最小的叶子代价
先考虑一种特殊情况,一个菊花图,根节点权值为(1),每个儿子对应长度为(a_i),分过去的对应权值为(p_i),那么要令(min(a_ip_i))最大,根据数学知识肯定是所有取到相等的时候最大,那么令(k=a_ip_i),有(sum{kover a_i}=1),解出(k)就可以得到(p_i)了,然后如果根节点传过来的值不是(1)而是(v),下面每个节点的收益是({kover a_i} imes a_i imes v),这样我们就可以把整个菊花缩成一条长为(k)的链,继续往上(dp)就行了
(K)
咕咕
(L)
最短路只有可能是(1,2,3),分类讨论一下即可
The 2019 China Collegiate Programming Contest Harbin Site题解
感觉自己全程(包括但不限于比赛时以及赛后订正)都在拖jz姐姐的后腿
(A)
二分答案(mid),记(a_i)表示前(i)个格子中总共被染色的格子个数,那么需要满足约束(a_ileq a_{i-1}+1,a_igeq a_{i-1},a_{r}geq a_{l-1}+k,a_{r}leq a_{l-1}+mid-k),最后不要忘了(a_n-a_0=mid),然后跑个差分约束康康有没有解就行了
(B)
对于某个(x)来说,往两边(F_m(x,y))一定是递减的,所以对于([L_i,R_i])中的某个(q_i),上一个区间中合法的值一定是一段区间,那么我们只要用(two pointer)来维护即可
(C)
大模拟,看懂题意就行了,不写了
(D)
大分类讨论
(E)
对于每个(1)类型的序列计算出它在最终序列中出现的次数,然后看一看出现次数最多的是否有超过总共的一半,找出现次数最多的可以用摩尔投票法,如果找出来的数不合法证明出现次数最多的不超过一半
(F)
直接爆搜就行了
(G)
根据(k-nim)的条件,相当于我们要选出一个最大权线性无关组,买的时候必须把两堆都取走保证了最终的线性空间中这个基不会有系数问题
那么我们维护一个三维不进位加法的线性基,最大权只需要做的过程中,当前的权值大于这一位的基的权值,就把当前数和这一位的基交换就行了,而这一位后面的所有基是不会改变的
顺便注意维护三维不进位加法不能直接暴力枚举位数,一个解决方法是用一个二元组((x,y))表示有(x)这几位为(2),有(y)这几
位为(1),那么转移讨论一下就行了
jz姐姐丢个板子就跑一点都不解释真是欺负人
(H)
咕咕
(I)
首先把无解判掉,记(x)表示可选的数的个数,(ans)表示答案,如果(h_i=h_{i-1}),那么下一位只能放之前可选的那些数,即(ans*=x,--x)。而如果(h_{i}>h_{i-1}),就说明有更新,因为既可能更新最大值也可能更新最小值,所以(ans*=2,x+=h_i-h_{i-1}-1)
(J)
根据(n)的奇偶性考虑是选(n,n-3)还是(n,n-2)就行了,记得判无解
(K)
由于每一轮兔子总重量一定,所以可以直接用每只兔子期望重量带进去算,发现期望重量每一轮的变化可以直接算,就可以了
(L)
先把所有的询问读进来并哈希记录下来,然后模拟一遍过程并不断用hash更新答案即可
2018 China Collegiate Programming Contest Final (CCPC-Final 2018)题解
已经变成(jz)姐姐的原题大赛了……
(A)
签到题
(B)
黑白染色之后把每个连通块搞出两个二元组,按所有二元组的最大值从小到大排序,从左往右做,然后把最小值放进一个堆里就行了
(C)
jz姐姐做过https://pan.baidu.com/s/10yhlawFXVpRDIKgK8cUNZQ提取码: fpu4
(D)
jz姐姐又做过,就上面
(E)
不难发现,原题等价于选出若干条边,使得删去它们后图中有至少(k)个连通块,求最小边权
如果连通块个数已经大于等于(k)了咕咕掉,否则对于树边,删去之后连通块个数(+1),且树边之间可以贪心,对于同一个环上的边,按边权从小到大排序之后,选了前(i)条边可以使连通块个数(+(i-1)),对于不同的环之间以及和树边,做个背包就行了,由于选的总边数不超过(O(k)),所以复杂度为(O(mk))
然而最麻烦的还是计算方案,我的方法是背包只做环上的,树边到时候单独考虑,对于(f_i)表示增加(i)个连通块时最小的代价,每一次(f_i)被更新时在(f_i)对应的(vector)里(push)一个三元组((x,y,z)),其中(y)表示这个环的标号,(z)表示环上选的点数,(x)表示(i-z)对应的状态的那个三元组在那个(vector)里的标号,这样方案就没问题了。输出只要把对应的边断掉,剩下一个连通块一个颜色就行了
(F)
只会(z)用(Simpson)拟合然后做圆的面积并,不过卡不过去。没看懂题解在写什么
(G)
颓一颓柿子,发现两个可以分别计算,而且两维的计算都可以(O(1))
(H)
如果存在某个关键点(dis(A,x)leq dis(B,x))那么(A)赢定了,如果不满足这种情况,我们以环为根,(rt_i)表示离(i)最近的环上的点,那么(A)能赢,一个必要条件是(rt_A eq rt_B)
记(nxt)是(rt_A)在环上的后继中第一个子树内有关键点的点,(las)同理,代表前驱,且满足(las,nxt eq rt_B),如果不存在(A)就gg了
然后有这么几种情况,如果(B)上环之后先染(las)再染(nxt),由于(dis(las,B)<dis(las,A))成立,那么(A)上环之后只会往(nxt)走,如果(B)能在(A)走到(nxt)之前到(las)再去(nxt),那么(B)赢定了。(B)上来之后先染(nxt)同理
另外一种情况,假设是(B)先上的环,然后(B)走到了某个点(p),满足(dis(p,nxt)<dis(rt[A],nxt))且(dis(p,las)<dis(rt[A],las)),那么(B)只需要待在这么一个点不动就行了,等(A)走上环之后和它博弈,(A)往哪儿走他跟着往哪儿走,那么(A)最多只能做到平局,所以判断(B)能否在(A)上环之前走到这么一个点就行了
如果是(A)先上的环,那么因为之前上面一堆判断都没有得出结果,(A)显然已经死了
(I)
把行最多和列最多的拿出来讨论一下,无解就减个(1)再算一下就行了
(J)
咕咕
(K)
据说是(RSA)裸题可惜我不会
(L)
由于哥德巴赫猜想在(OI)范围内是成立的,所以我们把奇数拆成(2+2+2+3+A+B),偶数拆成(2+2+2+2+A+B),对于(A,B)暴力求就行了
2018-2019 Winter Petrozavodsk Camp, Oleksandr Kulkov Contest 1题解
本场曲明唯一的作用就是给jz姐姐加油(曲明工具人已经连翻译的作用都没有了)
(A)
先把柿子列出来
我们要把它凑的尽量可以(FWT),也就是一个(c)每项都是两个关于(a,b)的柿子的积,发现还得多加一个两项,还得搞出一个(c_3)来确定
这样我们就把它的(FWT)搞出来了
由于我们这里是四位,所以我们得把读入的三进制转四进制,最后再转三进制回去
复杂度(O(k4^k))
(B)
咕咕
(C)
咕咕
(D)
懒,直接贴题解了
暴力多项式取模+高斯消元即可
(E)
总数除以(2)上取整
(F)
假设不存在边权相同的情况,按边权从大到小连边,如果连的是一条树边,且图上这两个连通块之间已经连通了,那么这两个连通块都(gg)了。如果连的是一条图边,且树上这两个连通块已经连通了,那么这两个连通块也(gg)了
(G)
咕咕
(H)
可以得出(p={1over m}sum_{i=1}^m max(i-p,p-i)),直接二分出整数部分,小数部分解出来就行了
(I)
咕咕
(J)
咕咕
(K)
答案(a_1-a_2)
2018-2019 ACM-ICPC, Asia Nanjing Regional Contest
(A)
先手基本上是必胜的,因为它可以把中间断开(1)或(2)个使得左右个数相等,然后后手怎么搞先手就在另一堆里怎么搞就行了。这个策略不行当且仅当(n=0)或者(k=1)且(n)为偶数
(B)
首先通过wqs二分把选(k)个的限制去掉,然后发现在([l,r])中选出中位数肯定最优,且最小代价就是(s_r+s_{l-1}-s_{(l+r)/2}-s_{(l+r-1)/2}),其中(s_i)表示前(i)个物品的坐标的前缀和,然后写出转移柿子发现可以用决策单调性优化,那么再在单调栈上二分就行了
(C)
假设我们固定了粉点,以其为根,且棕点在(u)的子树中,那么在(u)这棵子树中以棕点为根时,第二个粉点一定在这个根子树最大的儿子上,所以不能给粉点的点的个数就是(size_u-mx_v),其中(mx_v)表示只考虑(u)这棵子树且以(v)为根时(v)最大子树大小,那么不难发现这个棕点肯定是选在子树(u)的重心是最优的
然后如果我们已经知道了第一个粉点和棕点,如果我们移动第一个粉点的话,那么把它往远离棕点的地方移答案肯定不会变优,所以我们让新的第一个粉点在棕点对应的那棵子树里选,每一次我们选择对应的子树的重心作为新的粉点就行了,类似于点分,复杂度(O(nlog n))
(D)
这不就是zjt出的那道loj6360么……把那题代码复制过来就行了
(E)
对于一个串,我们维护一个栈,如果栈顶的前(k)个元素都相等那么我们把它们都删掉,这样可以把每个串都唯一表示成最简的形式,(S)能变成(T)当且仅当它们两个的最简形式相等,因为是嘉嘉写的所以我不会证明QAQ
(F)
咕咕咕
(G)
嘉嘉说是({n+3choose 4}),既然嘉嘉说是那就是了
(H)
咕咕咕
(I)
新建一个超级源表示可以让左边每个再匹配一次,跑个网络流就行了
(J)
分解质因子之后对于每个质因子分别计算贡献就行了
(K)
嘉嘉说每次随机上下左右即可通过……
(L)
咕咕
(M)
先把(s)反过来之后转化成对于(s)的每个后缀(s_i)求(lcp(s_i,t)),不会扩展kmp,直接二分+哈希艹过