散漫刷题

  • 散漫刷题

     [2023.4.5]
     cf1809D:
      考虑到两种操作的代价差是1,且一次操作的代价很大,说明操作数要尽可能少。这是一个排序问题,排序问题的本质是消除逆序对。交换相邻的数最多消除1个逆序对,而删除可以消除至少1个,因此删除操作是更好的。考虑确定最小的删除次数,考虑枚举一个分界点,分界点之前的1全部删掉,分界点之后的0全部删掉,这样肯定能找到最小的删除次数。找到最小的删除次数之后,尽可能把删除操作变成交换。如果有一对"10",那么考虑交换它们,此后其他"10"想要通过交换消除逆序对都至少需要操作2次,因此在总操作次数最小的情况下,将分界点中间的"10"更换成交换操作更优。

     [2023.4.4]
     cf1810D:
      每种type=1的信息可以告诉我们树的高度在哪个区间,每次算出区间求交即可。每个询问,我们可以算出在树高最大和树高最小时所需的天数,如果天数相同,则答案确定,否则不确定。
     cf1810E:
      首先,结论:如果连通块内ai最大的点能被打败,那么整个连通块都能被打败。有了结论,我们只记录当前连通块最大的点即可。考虑按ai升序考虑所有点,将点一个个加入图中。每当加入一个点i,这个点就是当前图中权值最大的点,考虑已经在图中的其他相邻点所在的连通块,如果连通块大小符合击败条件,则将i标记为能击败。枚举完所有相邻点后,将i作为根合并所有相邻点所在的集合即可。
      题解做法是:从起点开始维护连通块相邻点,每次找ai最小的进行合并,合并后拓展新的相邻点,直到不能拓展为止。如果一个起点被包含在另一个起点的拓展过程中,那么从这个被包含的起点出发不会更优。因此我们依次枚举每个点,如果当前点没有被拓展过,则作为起点进行拓展。每次拓展,要么是自己找到一块新的连通块,要么是包含以往拓展过的某块连通块,如果是包含关系,则大小会是被包含的最小块的至少2倍,因为要包含另外一个独立的块,肯定需要经过原本块的边界,块的边界显然是大于原本块大小的,因此至少是2倍,故每个点最多被logn个点拓展。

     [2023.4.3]
     cf1805D:
      很棒的树题。找到直径,假设直径长度为len,考虑k=len的情况,逆推回k-1...1,一开始是只有互为直径的点在一个集合里,当k=len-1时,每个点会连接距离为k-1的点,其实距离为k-1的点,就是直径连接的点的集合的相邻点。根据这个结论,其实不难发现,每次都是拓展相邻点。这样就可以用并查集做到O(nα(n))复杂度。很棒的题!
     cf1805E:
      顶级好题!如果一个数出现3次或以上,那么这个数无论如何都会在一边子树里出现两次。如果一个数只出现1次,那么这个数可以不考虑。剩下的就是特殊判断出现两次的数,对于这些数,dfs时弄1个set,记录子树内出现两次的数字和子树外出现两次的数,再弄一个数组,记录子树内每个数的出现次数,当发现2-1或者0-1时消除这个数,当发现1-2或者1-0时,增加这个数。

     [2023.4.2]
     abc295_f:
      很棒的题。先转化为前缀和相减形式,然后可以枚举S串的高低位为第几位,可以发现删去S串后,第i个串实际上对应数字i-1,二分出最大的数字即可。

     断更几日,去上海参加ECfinal,拿了个银牌嘻嘻!

     [2023.3.22]
     abc253_f:
      考虑最后一次对第i行的覆盖,用一个时间戳记录一下,可持久化线段树维护一下增量即可。

     [2023.3.21]
     abc191_f:
      考虑前i个数所能产生的gcd个数,用map存,每次遍历map即可。总复杂度不会很高,因为可行的gcd很少,相同的数字合并一下,避免重复计算。

     [2023.3.20]
     abc132_f:
      清新的dp。

     [2023.3.19]
     CF1793D:
      似乎并不是特别难,但是困扰了我好一会儿。对每种mex分别考虑,确定左端点和右端点,再计算区间即可。
     CF438D:
      线段树取模。有效取模会使一个数至少/2,所以一个数取模次数不超过log次,线段树暴力即可。

     [2023.3.18]
     abc293_f:
      并不难的分析题,小数字暴力,大数字可以直接二分
     abc294_g:
      离线莫队算法即可
     arc158_a:
      考虑加之后再整体-5,可以发现一个操作的本质就是让一个数+2,另一个数-2,总和不变。因此原和应该是3的倍数,数字之间差应该是2的倍数。步骤数就是以平均值为分界,正数值/2。
     arc158_b:
      要么选最大的三个,要么选最小的三个,看起来挺有理有据的
     arc158_c:
      妙题。题解做法是,和减去进位次数*9,计算进位次数,以此考虑每位被进了多少次即可。非常强的做法。

     中间几天生病了,比较糟糕

     [2023.3.12]
     abc290_f:
      并不是特别好想得组合数题,猪脑有点过载,以后再说。
     abc290_g:
      略有一点点糟糕的思维题,但是代码很好写。以后再写严谨证明。

     [2023.03.11]
     abc290_d:
      不难发现起点确定后,后面的点都确定,且不同起点走的范围在递增时不相交
     abc290_e:
      直接算有点难,但是可以算每对i,j的贡献。每对i,j贡献为min(i,n-j+1),固定左端点,右端点在一定区间内贡献为i,固定右端点,左端点在一定区间内贡献为n-j+1;注意相同时不产生贡献。

     [2023.03.10]
     gym104172B:
      题意杀!太蠢了
     gym104172D,I:
      待补,很强的两个题
posted @ 2023-03-10 03:45  praying_cqf  阅读(147)  评论(0编辑  收藏  举报