CF Round 982(Div 2)

游记

还是VP
口胡了ABCD的做法,然后C假了
打代码其实挺难的

题解

A

反复观看样例可知,如果两个开关状态不一样灯泡开,否则灯泡关
如果要灯泡开着的尽可能少,那么相同状态的配对尽可能多
此时就是00配对,11配对,
如果有落单的0必定有落单的1,最多凑1
没有就是0
反之要灯泡开得多,那么01的配对尽可能多
此时答案就是min(cnt[0],cnt[1])
其中cnt[i]就是满足aj=ij的个数

B

如果从数组中删掉k,那么数组就会变成两半
这两半中,左半边不管怎么分,各部分中位数必然小于k
因为最大数都小于k了中位数肯定小于最大数小于k
同理右半边不管怎么分,各部分中位数必然大于k
那如果各部分中位数组成的数组,这个中位数如果是k的话
其实只需要两边划分出相同的段数即可
如果左右两边都是偶数个元素,那就各分成两个奇数的段
此时k为奇数
否则两边都不用动,就一整段,此时k为偶数
唯一需要考虑的就是一半边为空的情况
此时只有另一半边也为空才行
也就是无解判断:
k=1k=n,且n1时无解
如果n=1那就得特判出去,很简单

C

对于能否构成三角形来说,
如果两个小边加起来大于最大的边,那必然可以构成三角形
所以如果钦定ai为最大值
首先大于ai的要被赋成ai
然后如果j,k,ajai2,akai2
那么显然aj+akai就寄了
所以至多存在唯一的j,ajai2
然后就是对a排个序先,
枚举每个ai,找到值域在[ai2,ai]的最大下标区间
两个下标lower_bound()/upper_bound()一下即可
不在这个区间范围的都要改成ai
取改的次数的最小值即可,这个显然可以O(1)算出来
枚举ai二分的复杂度O(nlogn)
排序时间复杂度O(nlogn)
总时间复杂度O(nlogn)
写法在下取整和二分的时候挺麻烦的,有些细节要注意

D

首先,如果ij,必然有pipj
其次,这棵树切开0以后必然是若干条链
这样的话首先考虑同一层的节点ij
ci为切掉0以后的链顶编号
如果ci+1<cj,并且i,j同层
那么中间空着的这么几条链必然不可能连上任何大于j的节点
否则k>j,pk<pj显然会寄
也就是说,可用的链顶ci这个集合的元素只出不进
那么就直接找链顶有多少即可
显然由于BFS序的关系,ci[1,l1],pl=1
也就是说我们直接找到l即可求出c
然后对于每个i,如果确定了i对应的链顶ci
直接问ci+1i+1的关系
如果ci+1ci+1直接把ci+1扔出去
如果找到了对应的ci维护ci这条链底下编号最大的元素更新即可
注意如果只剩下了l1那就不用问了

posted @   2K22  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示