配置方法
g++ problem.cpp problem.h grader.cpp -o problem.exe
常见注意事项:
-
命令行需要
cd到目录里面,或者直接用绝对路径。 -
绝对路径要加引号。
-
想要使用
freopen在grader.cpp里面加就行了。
例题
感觉都是人类智慧。
P8494 [IOI 2022] 最罕见的昆虫
二分答案。对于当前 ,每次加数,如果答案大于 就减掉。等到最后判断是否有 个数。
需要有各种二分中的继承优化这种东西,还需要 。
为了防止被卡,random_shuffle 一下序列即可。
P9529 [JOIST 2022] 一流团子师傅 / Super Dango Maker
P9529 [JOIST 2022] 一流团子师傅 / Super Dango Maker。
首先,大概思路肯定是一点一点减。我们先减去第一个数,然后这个数是新的颜色。如果再减一个数,答案不变,就新开颜色,变了,暴力看这个数是什么颜色。
显然复杂度炸了,。
我们发现我们需要在 次以内找到一个数的颜色。
这让我们联想到了二分,二分现在的集合,然后...做完了?貌似有点问题。
鉴于二分颜色不好写,直接二分在第几个序列,判断后面的序列没有这个颜色可不可以。
#751. 【UNR #6】神隐
注意到 ,所以我们想到了一种做法,就是询问之后点对之间如果有 次在同一个集合中,就有边。
但是这样处理起来会 TLE。
人类智慧:我们发现叶子结点在一半的询问中是单独的连通块,然后处理叶子节点,找出然后删掉。
CF1764G3 Doremy's Perfect DS Class (Hard Version)
CF1764G3 Doremy's Perfect DS Class (Hard Version)。
我们首先需要找到合适的 , 区分不出任何东西,所以我们先尝试 。
我们发现对于 ,可以进行两两配对,我们 可以求出 没有配对的个数。
然后我们想二分出来 在左边还是右边的话需要 ,我们发现一对数对这两个区间的贡献是相同的,要么都是 ,要么都是 。
然后现在的问题就是 不可能匹配,还有 为偶数的时候 也不行。
所以分类讨论:
-
为奇数,可以直接二分, 次。
-
为偶数,我们只需要在二分到左右相同的时候确定 在哪里,用 。但是很恶心的就是这需要 次。我们能不能优化?我们发现二分到最后一次的时候我们已经知道很多了,设现在是 ,已知 。我们发现 中不是 的数一定是跟左边或右边配对的。如果 和 相同,那么 是和 里面的数配对的,就直接询问 ,不同的情况同理。
CF1896G Pepe Racing
这道题是让我们把从快到慢的除了那 个数的数排序。
容易想到,我们一开始肯定是先分成 个栈,然后取出每个栈的最大值的比较,找出当前最大值。我们需要维护每一个栈当前的最大值,每当有一个数被取出,都需要重新把这个栈用别的栈中不是最大值的数填满,然后询问最大值。
这样循环,我们最后需要 场比赛,我们需要优化。
我们尝试把一些需要两次查询的改成只需要一次。我们考虑在最后剩下 个数的时候的情况,因为这种情况我们无法从别的栈中找到足够的不是最大值的数。
这种情况中,有 个数在自己的那个块内当最大值,还有 个数是“凑数”的,永远不会被选中,所以我们要考虑在 次确定这 个数的排序。
方法就是每次选这 个数没有被选中的加入询问集合,剩下的用那 个中的一些补全缺口,然后每次拿出最大的,循环直到这 个数只剩一个。
注意:如果你不用 set 写法,需要小心当前栈的数去别的栈当最大值,需要注意这种情况。虽然我就是用的 set。
P10831 [COTS 2023] 三角形 Trokuti
P10831 [COTS 2023] 三角形 Trokuti。
标签期望+随机化?
首先我们先预处理出来前 个点的连边情况,暴力即可。
然后我们可以发现,三个点我们有连个点的关系确定,如果查询出来的减去已知的是 ,那就可以直接确定,否则就需要根据后面的一直推。如果一直是 就表示 里面 交替。