日记

日记

Fri Apr 18 2025
5 分钟
1194 字

今天才切了 44 道题,太颓废了。

門松 Link to

总之就是非常神奇。

昨天晚上是因为读错题了导致被硬控一晚上。今天早上是因为码力太强又被硬控一上午。

考虑对于每个偶数 ii,那么我们发现:{ai1,ai,ai+1}\{a_{i - 1},a_i,a_{i + 1} \} 形成的三元组状态一定是 {0,1}\{0,1\}。对于最终的四个状态,大力分讨即可。

这种大力分讨的题往往都很考验码力。但是我的码力又不行。

Ski Slope S Link to

开启今天的主线。

考虑把询问离线下来。然后把它和边混到一个数组里。用结构体记录三个值:{val,id,type}\{val,id,type\}。其中,valval 表示这条边的难度/这头牛的水平。idid 表示边的终点/询问的 ididtypetype 就表示类型。对于每个点 uu 记录一个 disudis_u 表示它到 11 的距离,cntucnt_u11 有多少条边大于当前的水平。我们从大到小枚举每一条边/每一个查询。

  • 如果这是一条边,那么就说明这条边的终点以及它的子树 cntcnt 都要加 +1+1,因为 ci10c_i \le 10,我们用 1010set 维护每个 cntu=[1,10]cnt_u = [1,10] 的每个点。每次直接暴力 dfs 更新。剪枝:如果点 cntu>10cnt_u > 10,那么说明 uu 和它的子树无论如何都不可能是答案,直接 return
  • 如果这是一个查询,那么我们就枚举 i=[0,cid]i = [0,c_{id}] 的每个值,在 setiset_i 里查找 disdis 的最大值所对应的点。

记得把 set 的比较器重载成 disx<disydis_x < dis_y。还有,当有一些边的 valval 和查询的 valval 一样,那么点一定比边优先。

Sequence Construction S Link to

考虑 kk 在二进制下的第 ii 位。如果其为 11,就说明有一个数 xxpopcount(x)\operatorname{popcount}(x)2i2^i,说明 xx22i12^{2^i} - 1其实也不一定,但是我们按照这个策略构造是对的。

我们枚举 kk 的每一个为 11 的位。将其记录进答案。并将其从 mm 中减去。如果出现 m<0m < 0,就说明无解,因为我们已经按照最小方案来构造了。

对于 mm 剩下的,如果它为偶数,就在答案序列的末尾添加两个 m2\frac{m}{2},这样既能保证和为 mm,又能保证异或和不受影响。如果它为奇数,就先加 {1,2}\{1,2\},再加 m32\frac{m - 3}{2},原因同上。

记得特判 mm 剩下的是 11

OohMoo Milk G Link to

显然有 John 和 Nhoj 都会去操作最大的那几个数,于是我们把题意转化为:John 先对于最大的 AA 个数加上 DD,然后,Nhoj 去减每个数。但是总次数不能超过 B×DB \times D,单个数减的次数不能超过 DD

考虑二分。设当前二分到了 midmidchk 时我们把尝试每个 i[1,A]i \in [1,A]aia_i,减到 midmid,但是因为有“单个数减的次数不能超过 DD”的限制,所以有些数减不到 midmid。如果总次数大于 B×DB \times D,那么就说明 midmid 小了,往大二分。反之如果有剩余的,就把每个还能减的减到 mid1mid - 1,并计算答案,然后继续往小二分,尝试更大的答案。

后日谈 Link to 后日谈

我要变强!

4 月 20 日 Link to 4 月 20 日

迟早要完

T3 Link to T3

将柿子转化一下,变成 Ti×Cif\sum|T_i|\times |C_i - f|,发现这玩意相当于:对于每个 ii,有 TiT_i|CiC_i。求所有数的中位数。直接上离线将 CiC_i 离散化。然后权值线段树。具体实现:树上节点存两个信息:sumt,sumcsumt,sumc,分别表示该区间的 TT 之和和 CC 之和。中位数直接查询 tot2\lceil\frac{tot}{2}\rceil 的数就行。设中位数为 medmed。那么小于中位数的贡献是 medCmed - C,大于的是 CmedC - med。我们可以查询 i[1,med]i \in [1,med]CiC_i 之和和 i(med,n]i \in (med,n]CiC_i 之和。这样就能做到 O(nlogn)O(n\log n) 的复杂度。

后日谈 Link to 后日谈

但是我们赛时都没做出来的题,deepseek 想了 88 min 就过了?

吃枣药丸。