2023牛客寒假算法基础集训营5 自卑赛
A
注意到可以将价值排序 选择k个就可以前缀和来得到。
如何快速得到当前元素排名可以离线所有的询问 也可以直接在价值序列上二分,后者明显好写。
B
注意到如果n为偶数每次没人一定都会选一个石子 这就是平局。
否则先手必败,先手会多一个石子。
C
算是一个分类讨论的问题。
先考虑a,b串的长度分别为n,m.
不妨设n>m,此时考虑a是否前面一部分都是一样的这样在某个排列下可以全部变为0。
注意到b也要和a一样相同数字变为0.
此时再次看a,b的长度n',m' 若n'>m'则a一定大于b.
如果n'==m' 注意之后还需要逐位比对a,b确定是否存在\(a1!=0,bi==0\)的情况。
当n==m时如果两个不一样那么一定为!.
D
可以维护一个当前的答案区间[1,w] 可用道具利用stl来维护这里我用的是一个堆来维护最小的左端点。
模拟即可。
E
算是很难的构造题。
我是参考题解的想法的。考虑1号点不动其他点逐次碰到1号点。首先轮数一定为n-3 我不太会证明。
之后奇数轮偶数位置向右移动 奇数位置向左移动 注意这里设2是一号位置,3为2号位置。
偶数轮偶数位置向左移动 奇数位置向右移动。
容易发现经过n-3轮 3恰好到达n的位置。而2一开始就在2的位置(和1相邻。
那么容易知道每个数字都在n-3轮内和1相邻。
进一步的考虑两个初始同向,相向的数字也会碰到。
考虑相反运动的数字 考虑在第n-3轮后的位置也可以遇到。
构造结束。
F
是一个贪心类的题目,想法复杂了导致没写。
考虑先找到最大的字母 前面的观察是否能全删 不能就找次大的。
这样的情况答案为保留+序列后剩下的+删掉的排序。
另一种情况序列后剩下的为0 k还不为0 倒着把栈里的删了 因为已经删掉的数字中可能有比栈里的数字还要大的情况。
G
容易想到建图 跑最大匹配。
需要注意n号元素也需要建图 此时可能有log条边其他情况都是2条边。
直接匈牙利算法就行。
H
直接模拟。
I
很有意思的构造题。
注意一种方案一定不亏并且可能不赚的方案也合法。
那么先考虑一定不亏的方案 1 1 2 4 8...
这种方案不亏且花费灵石最少,如果这种方案不合法那么一定无解。
现在考虑多出来的灵石怎么做 在上述方案上增加灵石 如果给一号位置增加了x灵石 后面的系数就是该方案本身。
对每个位置不断的试增灵石即可。
可以知道复杂度为nlog
J
构造题。(怎么这么多的构造题啊喂。)
容易知道最远距离为n*n-1 这要求我们来一个单向边构成一条的路径。每个点出度<=1 入度<=1.
从起点开始构造是困难的,考虑从中间开始构造,容易构造出来 寻找规律把图生成出来就行。
K
每次选择x/2+1的人数抱团即可。
L
设一个人数状态直接dp就行了。
我直接跑dij了 多了一个log,有点蠢了。