CF做题记录

CF1550

CF1550D Excellent Arrays

观察样例可得:满足条件当且仅当初始序列满足ai=i ,然后选择n2 个位置x ,剩下位置+x ,其中x 为任意非零整数。对这个计数即可。枚举最靠前的减的位置然后枚举最靠后的加的位置计数,然后用上指标求和优化即可。

CF1550E Stringforces

二分答案然后用状态压缩dp判断。设fS 表示已经完成集合S 中的要求时最靠前的位置,转移十分显然。需要预处理长度为x 且全是小写字母v 的字符串能放的位置。

CF1550F Jumping Around

考虑到可达性,将该问题转化为一个图论问题:在u,v 之间连接边权为||auav|d| 的边表示偏移量大小。这样如果存在一条从si 的路径满足经过边权最大值f(i) 不超过k 则答案为Yes,否则为No。

根据经典结论:任意两点间的任意路径上边权最大值的最小值等于在最小生成树简单路径上的边权最大值。因此只要建出最小生成树即可。这里考虑使用boruvka算法。现在关键在于如何对一个联通块求出以它连向其它连通块的边中权值最小的那一条边。枚举联通块内的每个点u ,要求最小的v 使边权尽量小,只要av 距离au±d 尽量小。使用set lower_bound即可。

CF1592

CF1592C Bakry and Partitioning

首先题目不要看错!!接下来可以转化为是否存在三个连通块使得其内部点的点权异或和均为sum,其中sum表示所有点权异或和。只有两种情况:1.存在v1,v2 满足其子树内均存在某个子树异或和为sum 2.存在u,v 满足uv 的祖先且u 子树异或和为0,v 的为sum。dfs判断即可。

CF1592D Hemose in ICPC ?

需要找的其实是最大边权。根据询问次数考虑二分,关键是如何保证每次二分时点集都是联通的。直接在欧拉序上二分即可。(求欧拉序不要写错)

CF1592E Bored Bakry

与大于异或意味着存在某一二进制位满足更高的位都一致但是当前位与是1而异或是0,即这一位全部是1且有偶数个,因此区间长度一定为偶数。考虑前面的位相同,分0/1两种情况:1.存在0且有偶数个1。2.全是1且有奇数个。第二类情况显然不会出现,而对于第一种情况,可以排除掉存在0这一条件,因为这样答案不会变大。于是我们枚举当前位,对数列做前缀异或和,那么前面的位相同意味着值相等。用vector存下值为i,下标奇偶性为0/1的下标,然后扫一遍同时得到最大值即可。

CF1580

CF1580B Mathematics Curriculum

所有包含这个数的区间中,不同的最大值的个数恰有 m 个意味着[1,x] 的后缀最大值和[x,n] 的前缀最大值个数,而这就是这个数在排列建成的笛卡尔树中的深度(注意这个转化)。于是记fi,j,k 表示长度为i 的排列中深度为j 的点有k 个的方案数,dp即可。

CF1580C Train Maintenance

根号分治。首先先进行差分答案数组s ,最后再前缀和回来。对于xi+yi>B 的点暴力做。对于xi+yiB 的点,xi+yi 的取值只有B 种,因此可以用数组Di 维护s 数组中下标除以xi+yii 位置的答案,那么每次的贡献就是区间加,仍然可以转化为差分+前缀和。复杂度为O(nn)

CF1601

CF1601A Array Elimination

与运算的一个性质是每个二进制位相互独立。对每个二进制位进行考虑,假设该位总共有d 个1,那么容易发现k 合法当且仅当kd 。因此最终答案就是所有d 的最大公约数的约数。

CF1601B Frog Traveler

可以直接dp,然后使用数据结构进行优化。也可以直接建图后跑01bfs,但是需要线段树优化建边。

CF1601C Optimal Insertion

使用如下策略必然能够达到最优解:对b 的每个元素bi 放到满足放入后新产生的逆序对(即前面比bi 小的数的个数和后面比bi 大的数的个数)最少的位置。

考虑证明。关键在于每个bi 都能取到最小值,无关插入顺序。我们考虑将b 从小到大地排序依次插入。令ci 表示在i 位置后插入当前的b 时新产生的逆序对。那么对于ai ,假设它从原来的大于b 变成了小于b ,那么相当于对于x[1,i],cxcx+1 ,对于x[i+1,n],cxcx1 。而初始时c=[1,2,3,,n] ,每次相当于前缀加后缀减,那么最小值的位置一定是单调右移,即b 越大,其最优位置越靠右。这样不仅每个b 均能取到最小值,同时b 内部也不会新产生任何逆序对,因此这样一定是最优的。具体实现时使用线段树进行维护即可。

CF1601D Difficult Mountain

结论:按照第一关键字为max(s,a) ,第二关键字为s ,第三关键字为a 从小到大进行排序。依次考虑是否能选即能获得最大值。考虑证明。对于两个元素(s1,a1),(s2,a2) 。分三种情况:1.s1<a1,s2<a2 2.s1>a1,s2<a2 3.s1>a1,s2>a2 分别讨论即可。

CF1601E Phys Ed Online

mni=mint=ii+kat ,那么对于区间[l,r]

ans=al+j=1l+kjrmint=0j1mnl+kt

按照modk 进行分类后,可以将问题转化为k=1 的情况。此时从右到左进行考虑,对于每个位置能做出贡献的一定是一个单调递减的序列。维护这个单调栈,然后维护两个数组goi,j,si,j 分别表示从i 出发跳2j 步后到达的点,以及经过的数的和。每次询问时倍增即可。

CF1603

CF1603B Moderate Modular Mode

x>y 时答案可以为x+y 。否则考虑令n=ax+b,y=cn+b ,然后将n 代入得y=acx+b(c+1) 。大胆令b(c+1)=ymodx ,然后由于2ymodx ,因此再大胆令c+1=2 ,则b=ymodx2 ,发现满足b[0,x1],b[0,y1] ,因此答案即为yymodx2

CF1603C Extreme Extension

先考虑对一个序列求出其“extreme value”。考虑从后往前找到第一个i 满足ai>ai+1 。容易发现至少需要将ai 分为aiai+1 尽量平均的份才能满足条件。考虑到需要让操作总数尽量少,因此需要让操作后最小的数尽量大,因此恰好将ai 分为aiai+1 就是最优的。令ai=t=1kbt(b1b2bk) ,则k=aiai+1,b1=aik,bk=aik 。然后ansk1 ,将ai 替换为b1 ,继续进行上述操作即可。最终的ans 就是答案。

对于原问题,直接做可以做到O(n2) 。优化考虑dp。令fi,x 表示有多少j 满足ji 且从j 开始操作到i 时该序列的第一个数为x 。转移十分trivial,按照上面的过程模拟即可,即fi+1,xfi,aiaix 。可以发现对于状态fi+1,x ,其对答案的贡献为ifi+1,x(aix1) 。容易发现状态数事实上仅有O(105n) 个,直接dp即可。

CF1603D Artistic Partition

考虑c 到底是什么。

c(l,r)=i=lrj=ir[gcd(i,j)l]=d=lrlir,diijr,dj[gcd(i,j)=d]=d=lri=1rdj=1i[gcd(i,j)=1]=d=lri=1rdφ(i)=d=lrS(rd)

S 可以线性预处理。然后我们对于每个r[1,n] 求出每个rd 处的S 的前缀和,那么c(l,r) 就可以做到O(1) 求出了。

对于f(n,k) 我们显然有转移方程:f(n,k)=mini=1n(f(i1,k1)+c(i,n)) 。直接做是O(n3) 的,考虑优化。首先是减少状态数。可以发现c(l,r)rl+1 ,而当r2l1c(l,r) 取得下界。对于最小的k 满足2k>n ,我们考虑取xi=2i11 ,在这样的情况下所有的c 同时取得最小值,显然f(n,k) 是最小的,答案就是n ,不需要dp。同时当k 更大时答案仍然能取得最小值n

现在只需要考虑klog2nk 了,但复杂度仍然是O(n2logn) 的。考虑优化转移。观察转移方程可以发现其形式非常经典,于是我们可以大胆猜想c 满足四边形不等式。事实上的确如此,按照定义即可证明。那么令g(n,k) 表示f(n,k) 的最优转移位置,就有g(n1,k)g(n,k)g(n+1,k) ,即决策点单调不左移。因此采用分治的做法就可以对于一个kO(nlogn) 的复杂度求出所有的f(n,k) 了。

总时间复杂度O(nn+nlog2n+t)

ps:即使每次转移时暴力根号地计算c(l,r) ,不知道为何也可以通过。

CF1588

CF1588B Guess the Permutation

首先通过二分可以在30次询问下找到 k 的值。接下来不妨设 kj+1=m,ji=n ,那么我们再询问 [1,k],[1,k1] 这两个区间,设其答案分别为 p,q ,那么可以得到 (n2)+(m2)=p,(n2)+(m12)=q ,联立即可解出 n,m ,从而求出 i,j

CF1588C Game with Stones

容易发现一个序列 a1,a2,,an 是winning的当且仅当 a1+a2++an=0 且对于所有奇数 p 都有a1a2+a3+ap0 ,对于所有偶数 q 都有 a1+a2a3++aq0 。证明可以考虑 a1 一定和 a2 一起被减去,然后以此类推下去。

对这个东西计数方法很多,在这里介绍一种比较简便的做法,即枚举右端点,同时使用两个set分别维护当前情况下的所有奇左端点和偶左端点。右端点向右移动一步时,加上此位置的贡献,然后排除掉不满足前缀交错和不小于0的左端点,因为在后面的右端点中它们也不可能合法了。最后统计其中0的个数,贡献到答案中即可。

CF1588E Eligible Segments

可以发现点 P 到线段 AB 的距离是 P 到射线 AB 和到射线 BA 距离的较大值。于是我们可以枚举点 P ,然后 O(n) 求出所有的 Q 使得所有点距离射线 PQ 的距离都不大于 R 。最后 O(n2) 枚举统计答案即可。

考虑以 A 为半径为 R 圆心作圆,那么如果某个点在圆内,那么其到射线的距离一定不大于 R 。否则我们考虑点 C ,如下:

如图所示,CD,CE 为切线, F 为线段 CE 上一点满足 FAC=FCACGAF 垂线, F,G 类似。

根据三角形全等可以发现 CG=CG=R 。因此 C 距离射线 AB 不大于 R 当且仅当射线 ABGAG 以内。注意 GAG 是一个定角,于是可以将所有点对应的角求交,然后看哪些射线在该公共角内即可。

CF1588F Jumping Through the Array

请参见wlzhouzhuan的博客

posted @   BILL666  阅读(116)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示