251028 模拟测 总结

拖了好久啦,哎也不能怪我啊,作业那么多而后又病了啊。。。。。。

总之是终于补回来了。/ll

分数不大记得了,好像是 \(90+100+?+? = 220\),总之就是 T1 不该挂分的。

Pro.A

我问你呢,为什么判了左边界却不判右边界?

想都想出来了,却没判右边界。\(\le 0\) 的情况判了啊,咋就不判下 \(> m\) 的情况呢?

还好数据强度不是很高,不然会给我卡光。

大概就是枚举公差然后算出首项找最大的,然后再在所有里面找最小的。

时间复杂度 \(O(\frac{m}{n} \times n)\),相消了,即 \(O(m)\),过得去。

Pro.B

还好想到了,不过用 set 是白整,其实只要记录度数就可以啦。

转变一下这个题目的条件,可以发现最后不被踢出朋友圈的人肯定是还没到他就已经被整成单个儿了的,然后再分析一下,就会发现,如果一个人 \(x\) 没有与任何一个 \(>x\) 的人直接相连,注意要求的是直接相连,仅仅联通是不行的,那么这个人就不会被踢出朋友圈。

那这玩意儿咋维护呢,很简单,记录 \(d_u\) 表示 \(u\) 这个人和多少个 \(>u\) 的人直接相连了,每次做操作的时候对应进行加减,同步维护答案,查询的时候直接输出就好啦。

Pro.C

抽屉原理?真是神秘。

感觉这个题目有一点投机取巧的感觉在里边(

注意到如果存在三个连续的数,它们在二进制表示下的最高位相同,那么可以选择对靠后的两个数进行一次操作,这样最高位就消掉了,肯定比第一个数小,因此只需要 \(1\) 次操作就行。

由于序列是单调不减的,题目又保证了值域最大 \(10^9\),根据抽屉原理,当 \(n>60\) 的时候必定存在三个连续的数,它们在二进制表示下的最高位相同。这个可以直接判掉。

那么剩下的就只有那些 \(n \le 60\) 的部分了,这个范围随便搞,跑个 \(O(n^3)\) 的双指针一样的东西就搞完了,甚至可以 \(O(n^4)\) 纯直接枚举,毕竟这个范围小到可怜呀!

Pro.D

这题还蛮好玩的,虽然代码不短。而且细节巨多!

哎我还是不得不说这个思路真的很妙啊。

考虑将这个逻辑关系建成一张图,一张有向图,只是一开始还无法定向。对,就让每组操作的 \(l\)\(r\) 连一条边。让边的出节点视为该操作选择的民族对应的节点。我们只需要构造一种方案使得每个点的入度均为偶数,因为这样就可以一半加一半减了。当然如果中途发现无解则直接输出。

由于图可能由多个连通块组成,因此可以用并查集一开始维护一下块的情况,然后每个块分别考虑即可,套路是一样的。

首先能发现无解的情况,当且仅当存在一个连通块的边数为奇数,这个时候无论你怎么划分都做不到所有节点入度均为偶数。

我们只需要关注每个节点的入度的奇偶性即可。只要改变一条边的方向,相应节点入度的奇偶性就会发生变化。

考虑使用树的结构来维护这个东西。跑出每个节点的 DFS 树,对于非树边我们随便定方向,然后对于树边则按照奇偶性进行考虑。如果子节点目前的入度为奇数,则要让它的奇偶性受到改变,否则要保护好它的奇偶性,则只能改变自己。

这样下来我们就可以实现每个节点的入度均为偶数的情况了,最后再将这偶数次操作对半分,一半加一半减,最后输出即可。

posted @ 2025-11-05 16:14  嘎嘎喵  阅读(8)  评论(0)    收藏  举报