互测记录

有分了不起,开机夸自己!

2023.10.29 Round 1

看 T1,不会;看 T2,发现不是我能做的题;看 T3,网络流计数,感觉也做不了。

那么只能做 T1 了!做做做,不会一点!破防了。

最后没有写代码,以为大家都会 T1,最后好像只过了 20 多个。

A 优惠购物

初始钦定不用优惠券,此时最后会剩下 ai 个优惠券。用优惠券,新增的优惠券会减少。考虑一边用优惠券,一边使得减少的优惠券最少。

分析一下 i 的减少量:

  • 第一阶段:前 aimodc 次使用,减少 0
  • 第二阶段:使用 c 个,减少 1
  • 第三阶段,使用 [0,c) 个,减少 1

从性价比的角度分析,第一阶段 > 第二阶段 > 第三阶段。

对于第一阶段,从后往前贪心。

对于第二阶段,从后往前贪心。

对于第三阶段,假设 sii 剩余可以支配的优惠券数量,hi 表示已经选了的数量,我们希望每次选优惠券数量最大的,这样剩余最小。那么 i 可以选的数量为 min(bihi,si,minj>i(sj1)),我们希望每次找到这东西的最小值。直接维护是做不了的,但是发现后面两项 min 有单调性,所以可以把 bihi 从大到小排序,每次加入所有大于 bi1hi1 的数,这个用堆不难维护。

B 树哈希

不会数学。

C 网格图最大流计数

不会线性代数。

2023.10.29 Round 2

开场看 A,猜 DP 的时候只需要记录一对 i,j 使得 ai<aj,那就记录最大值和最大值前面一个最大值试试,发现不对,不过发现只要保证后面接一个合法的段就好了,是一个类似区间 DP 的东西。写一下发现 80,把算答案改成 O(n) 就过了。

看 B,不会一点,但是找规律发现了 limi=i(n+12)+1,思考这是为什么,发现不知道是为什么。

看 C,怒砍了 5 分。

看 B,发现 limi5 可以只搜前 10 个,剪枝之后过了 35。

最后 100+35+5=140。

A 序列

考虑 DP。按照前缀最大值分段,每次找到最后一个前缀最大值和倒数第二个前缀最大值,分别设为 p,q,那么 [p+1,n] 是一个值域在 [ap,aq] 之间的段,并且可以发现最大值前和最大值后是独立的。据此转移,设 fi,j 表示长度为 i,值域为 j 的序列数量。转移是 fi,jfx,yj+1fi+1+x,y,其中 y 是最后一个前缀最大值,j 是倒数第二个前缀最大值,这样是 O(n2m2) 的。考虑钦定序列满足 [0,j] 中所有数都出现过,那么答案就是 (m+1j+1)fn,j,稍微修改一下转移就好了,复杂度 O(n4)

B 没有创意的题目名称

先明确一下合法条件:

  • 对于 i+jnfi+fj>n
  • fi+j=ffi+fj

打个表发现序列的一段前缀是 0i,一段后缀有循环节。

考虑循环节是为什么。假设 fi=fj=x,那么有 fk+i=fk+j=ffk+x。所以假设第一个 p 是最小的 p 使得存在 q>p 满足 fp=fq,那么对于 i>pfi=fi+qp,即循环节长度是 k=qp

考虑前缀是为什么,令 f0=0,根据上面的理论,i<p 的所有数是互不相同且唯一的,在 f0=0 的情况下,fi=ffi,由于是一一映射的关系,所以 i=fi

所以对于 iq,我们有确定的填法,对于 i<p,同样有确定的填法。问题在于解决 pi<q 的问题。下面我们分类讨论 f0=0f00

先讨论 f0=0 的情况。我们探讨上面的条件是否是充分的。对于 ip,有 fi=f(ip)modk+p,同时有 fi=ffi,不难发现 (ip)modk+p=(fip)modk+p,所以显然有 fii(modk),用这个等式带入 fi+j=ffi+fj 不难证明条件三。但是条件二未必满足。先推一些必要条件:

  • 对于所有 2in 需要满足 2fin,如果 q1n2,那么它是充要的。
  • fi+fnin,因为 pi<q,fi0,所以 fii,可以推出 fi=i

所以它充要了。也即:q1n2,只需满足 2fin,否则,fi=i。枚举 k,p 可以平方计算。

再讨论 f00 的情况,那么 f2f0=f0,有 p=0,k2f0。分类讨论 kf0kf0

如果 k|f0,考察 fi+0=ffi+f0 仍然有 fii(modk)。因为 fi>0 所以不会出现 2(k1)>n 的情况。考察 fi 的最大值,发现可以取到 k,于是 2kn,此时只需要满足 2fin 即可。

如果 kf0,说明 2k,2kf0。继续考察 fi+0=ffi+f0fii+k2(modk)。那么 fi 的最大值会是 k1,所以 2(k1)n,仍然只需要满足 2fin

于是直接乘起来计数即可。复杂度为 O(n2)

C 傅里叶与交通规划

摆了。

2023.11.5 Round 3

雅礼两周一次的假在今天。

A Permutation Counting 2

首先 x 个上升意味着有恰好 nx 个上升段。

容斥,钦定原排列和逆排列有 x 个上升段和 y 个上升段,尝试每次填一个逆排列上升段。注意到我们填的位置一定是原排列上升段的一个前缀,每次填数相当于往前缀后加数。尝试设 ai,j 表示逆排列内第 i 个上升段给原排列 j 个上升段加了 ai,j,那么矩阵 a 的限制是:

  • 和为 n
  • 不存在任意一行或者任意一列的和为 0

容斥插板计算即可。复杂度 O(n3)

怎么计数只会 DP 了,未必所有题都可以 DP 做,可以尝试转化计数新的对象。

B 化学实验

不会写 LCT

C 物理实验

不会数学

2023.11.6 Round 4

开场看 T1,感觉是个流题。推了推感觉很有感觉啊!然后就会了点数和边数都是 O(q) 的流做法。写一发发现 60,把 SPFA 换成 dijkstra 还是 60。

然后因为 m15,感觉是什么高妙反悔贪心题,我又恰好不会反悔,于是拼了个 m=2 跑路了。

看 T2,不想做,5 分跑路。

看 T3,发现会第一问,然后想了想,感觉会 DFS 序为 1n 的第三问,写一下发现假了,还要做个第二问。然后做了下第二问,想到了一个二分 DP 做法,写写写,发现细节好多。机房好吵。写不完了!摆烂!

出榜发现大家都会 T1,看了眼 T1 题解,然后破防了。

感觉对这种高强度的比赛还不是很适应啊,稍微不注意就少了好多分。我好菜呜呜呜。

A 数据库

把所有修改分成两类:

  • 需要保存到下次修改该颜色,此时它占用的位置的时间区间为 [posi,posi+1)
  • 改完就不管了,此时它占用位置的时间区间为 [posi,posi]

要求每个位置被覆盖的次数不超过 m 次。

很像志愿者招募。利用下面的方式建图:

  • 建立一排点 ii+1,流量为 m,边权为 0
  • 对于每个颜色,建立一列点,其中第 j 个点向 posi,j 连边,流量 1,费用 0posi,j+1 向第 j+1 个点连边,流量 1,费用 wi。其中 posi,j 为第 i 种颜色第 j 次出现的位置。

直接跑费用流即可,复杂度 O(nqlogq)

这个做法还没有通过。

upd:小丑了,虽然硬流是能做的,但是志愿者招募的复杂度更优秀,是 O(mqlogq) 的。

B 左蓝右红

直接做完全不可做,需要找一些高妙结论。

把整个平面分成若干块,有一些必要条件:

必要条件一:边相邻的两个区域必然有一个无色。

证明考虑奇偶性,由于没有两个矩形有公共边,所以经过一条边必然改变覆盖次数的奇偶性(更准确的,覆盖次数会恰好变化 1),所以覆盖次数不会同时为奇数。

必要条件二:点相邻的两个区域不同色

证明考虑公共点,如果同色,那么它会有四条同色出边,而因为矩形的染色是蓝红相间的,所以每个点应该恰好有两条蓝色 / 红色出边,矛盾。

上面两个条件实际上已经是充分的了。

考虑判断合法,扫描线判断。对于一个横坐标区间,图形由偶数条横向的线段组成,其中第 2k12k 条直线之间的区域是有颜色的。那么条件是:两条线段必须同色,并且,如果一些直线穿过了一条纵向线段,那么直线的颜色会改变。

注意到条件是等价关系,所以可以维护每条直线与哪些矩形的左下角颜色相同,利用扩展域并查集即可做到平方。

进一步观察,如果一些直线穿过了矩形的左侧线段,那么区间内直线的对应关系会改变(横线编号奇偶性改变),简单推导等价关系可以发现,穿过这条线段的所有直线颜色都相同。所以可以利用连续段均摊维护限制,复杂度 O(nlogn)

写起来有点麻烦,放个代码在这里。实现思路是先处理区间推平,然后对于端点特殊考虑其配对的线段。code

C 世界沉睡童话 70p

step 1:刻画点运输的路线

不妨令被删掉的边为黑色,其余边为白色。

从局部信息入手。对于 u,先依次遍历它的所有儿子,如果儿子中有黑色,停止遍历,直接交换。然后遍历其父亲,如果边为白色,停止遍历,否则将点移动到其父亲。移动到其父亲之后,依次遍历它的所有右儿子,如果有边是黑色,停止遍历,否则继续遍历……依次类推,可以找到其最终位置。

从终点推起点的方式也是类似的,对于一个终点,判断另一个点是否为其起点的方法也是简单的,只需要判断路径上的每条边是否为能够使遍历继续的“预期颜色”,那么终点边和预期颜色不同,其余边和预期颜色相同。

step 2:解决问题

上面的操作可以导出一个平方做法。维护部分染色方案,边为 黑 / 白 / 未染色 三种状态。分两步解决问题:

  • 找到答案与 p 的 LCP:从 i=1n 依次遍历。对于每个点,暴力找到其合法的起点集合,如果起点集合存在数大于 pi,那么它可以成为第一个比 pi 大的元素,i1 可以成为 LCP。计算合法集合之后,执行 fix(i,pi),表示令 i 的位置交换成 pi,并将沿途的所有点染成对应颜色。如果出现矛盾,直接跳出循环即可。

  • 还原方案:假设 LCP 长度为 l,对于 i=1l,执行 fix(i,pi),对于 l+1,找到集合中比 pl+1 大的最小的数 pos,执行 fix(l+1,pos),对于后面的所有数,找到合法集合中最小的数并执行 fix 即可。

暴力实现是平方的,相信大家都很会重链剖分,可以优化到 O(nlog2n)。放一下我写的石山 code,大致思路是分轻重儿子维护预期颜色,fix 操作用并查集找到未染色的颜色暴力染色。

2023.11.7 Round 5

开场看 T1,很有感觉啊,但是只会 O(nm2+qmlogn),感觉不太过得去的样子。想了半个小时也没什么思路,那先写一下赶紧看后面的题吧,怎么说也能过 105 和 B 性质

个屁啊,写完只有 10pts,B 性质 T 掉了(B 性质复杂度是 O(qmlogn)),sub4 WA 了。但是我大样例过了啊。想着做这么久不能只有暴力分吧。那我上个拍子,但是拍子没挂。感觉是大数据 UB 什么的,然后还真查出来几个,交上去之后还是只有 10pts。

上头了,一个 T1 你能秒我?因为之前写法空间爆了,换了个空间更小的写法,但是还是寄了!

奋斗 3h 只有暴力分,感觉难受。看 T2,发现可以贪心求 f(p),然后发现直接 DP 就行了。原来签在 T2 啊,写一下 WA 了,拍一下查了个错,就过了。

群里听说 T1 锅了,难绷。

然后头晕的不行,写 T3 的 10pts 就下班了。

回去发现 T1 数据修好了,但是没交,交上去应该有 35。

感觉 11 点开 T2 还是比较寄的,当时脑子都糊涂了,想题开题开始要趁早。

A Xor Master

结论:g(xy,S)=g(x,S)h(y,S),其中 h(y,S) 表示 yS 一个子集的异或最小值。证明考虑求异或最小值的过程,如果线性基中某一位有数,那么 g(x,S) 这一位一定是 1h(y,S) 这一位上肯定是 0。异或起来一定是 1,实际上与求 g(xy,S) 的过程一致。

那么可以做到 O(nm2+qmlogn)。因为有上面的结论,可以线段树拆位维护异或值,改变 S 的时候暴力重构,最多只会重构 m 次,单次重构 O(nm)

考虑优化单次重构,可以用一个套路:把线段树上每个节点中维护的 m 个值写成二进制的形式,形成一个 m×loglen 的矩阵,然后我们转置这个矩阵,维护 loglen 个二进制数,然后用位运算模拟二进制加法,因为每一位是独立的,所以为压位提供了可能性。所以复杂度变成了 T(n)=2T(n/2)+O(logn)=O(n)。所以最后复杂度为 O(nm+qmlogn)code

B 栞

考虑怎么求 f(p),假设我们已经确定了 q1l1,当前是第 j 次分割。那么这次分割的右端点最大是 n(kj),当然可以直接操作 [l,n(kj)],但是我们希望每次分割的长度尽可能短,所以我们找到最短的分割,使得其前缀和分割 [l,n(kj)] 的前缀相同。这相当于找到排列的第一个“值域断点”,也即:断点之前任意数比断点之后任意数小。所以每次找到端点即可线性求 f(p)

因为求 f(p) 的方式非常简单,考虑 DP。设 fi,j 表示左端点为 i,当前是第 j 次分割的方案数。那么要求 [i,n(kj)) 这一段数比前一段整体要大,n(kj) 没有限制。这说明一件事情:如果 qi<qi1,且 i1 之前递增,那么 i 一定是一个左端点,且右端点为 n(kj),后面的分割方式是唯一的。所以找到第一个 qi<qi1 的位置 pos,对于前面的 DP,每次拼上一个没有断点的排列(设长度为 n 的没有断点的排列为 gn,容斥容易转移),然后枚举以 pos1 为右端点的段和它是第几段,判断值域的限制,然后直接累加进答案。复杂度是 O(n3) 的。

C 数据结构

不会数据结构。

2023.11.9 Round 6

好难,不会,摆了。

2023.11.11 Round 7

开场三个题都看了一下。先开 T2。

然后发现我会做链的平方。然后发现如果按照 BFS 序插点就可以满足链的性质了。写了一个平方上去拿了 40。

然后发现反演一下套一个多点求值就做完了,但是我不会多项式,然后摆了。

看 T1,想了一下发现会排列的平方对数,写一个上去发现平方对数过了 10000,很震撼。然后又想了一下发现会了非排列的平方对数,写一发发现只有 40。然后会了平方,写一下发现还是只有 40。然后卡了半天常都过不去。最后把一个前缀和直接用树状数组求,它过了.jpg

然后写了个 T3 暴力下班了。

群里面讨论了一下,我,ya,zyf 三个人分数一模一样,怎么回事呢。

关于题目:摆了!!!

2023.11.12 Round 8

感冒了,摆了。

看起来好难,这就是 nfls 的实力吗。

2023.11.14 Round 9

上去去看了一下医生,11:00 才回来。看了眼 T1,感觉广义串并联图,问题是我并不会写这个东西。看 T2,不想看了。看 T3,反正肯定是我不会做的题。然后开摆了。

怎么这么摆啊。

然后 T3 过了一车,看一下也会了,怎么倒着放啊。

C Tree Topological Order Counting

存在一个 O(n3) 的做法:

枚举点 u,令 fx,i 表示 x 子树的排列,u 的位置在第 i 个的方案数。每次可以平方转移。

注意到这个做法最后都会在相同的终点 f1,i 统计答案。考虑倒着做。设 gu,i 表示状态 (u,i) 在最终状态中的系数。初始化 g1,i=bi,然后倒着转移,就做完了。可以实现到 O(n2)code

题解给出了一种神秘构造使得我们可以求出 fx,y 表示 ax=y 的排列数。考虑一个过程:

  • 点有黑白两种颜色,初始所有点都是白色。每次选择一个白点,然后把其祖先中最浅的白点给染黑。假设第 i 次被染黑的节点是 u,我们令 au=i

显然所有排列的数量是 n! 级别,且从数的拓扑序到这个过程具有良好的映射关系:一个拓扑序恰好对应 szi 个排列。

所以可以直接计数这个排列,然后把答案除以 szi。设 ansx,y 表示 x 节点在第 y 次被染黑的排列数量。固定 x,并设 fi,j 表示染黑 i 个节点之后,最浅的没有被染黑的儿子是 j,直接转移可以做到三方。但是可以注意到如果 u,vj 阶父亲是相同的,那么 x=ux=v 的时候 fu,i,j=fv,i,j,所以状态数降到了平方,只需要记录点数和最浅的儿子即可。

什么诡异双射,记住了。

2023.11.16 Round 10

最小丑的一集。

看 T1,ptsd 了。然后也不太会这种题。先看 T2,发现也不会,但至少有 80 的点分治分。写一手点分治,但是太久没写数据结构了,写了 2.5h/px 什么码力。

然后没啥时间了。给 T3 写了个 20,因为不太会博弈所以继续回来看 T1。但是还是不会做,因为时间不多了,然后 T1 暴力还没写,所以心态有点炸,脑子一直是糊的。最后弃疗了,直接写暴力下班,然后暴力还写挂了/cf

然后比较精彩的是,我中午休息一会回来重新看 T1,发现之前猜的一个结论(每一层按照高度排序之后相邻两个数合并)看起来非常真。然后这个结论套 AGC009E 就可以得到一个平方做法。写完 75p,改成滚动数组后直接过了???

啊啊啊啊啊啊啊啊啊啊啊啊啊

感觉还是做题没有自信的问题,最优化题讲究一个自信即巅峰。

A 雷同

先刻画一下最后的答案:假设第 i 个点在二叉树合并的时候深度是 depi,那么答案是 widepi+(2li1),其中 li 是点 i 高度较小的儿子的高度。

你发现 wi 与答案的关系仅仅在于深度。考虑枚举深度序列,计算对于确定的深度序列的最优答案。把合并看成一个这样的过程:每次把同一层 2k 个结点两两配对,然后删掉其中高度较小的数,加上贡献,并把高度较大的数高度 +1 之后传上去。那么我们肯定希望删掉的尽可能大,所以删除策略一定是按照高度排序之后相邻两个数配对,然后删除其中一个。

注意到一个节点被删除的时间是可以确定的,因为这相当于每次把所有偶数提取出来,把奇数删掉,所以在排名为 j(0-index)的数被删掉的时间是 ctz(x) 轮,其中 ctz(x)x 末尾 0 的个数。所以设计 DP 状态 fi,j 表示一共放了 i 个点,同层有 j 个点的最小代价。每次要么同层加一个点,要么进入下一层,贡献是容易计算的,复杂度为 O(n2)

2023.11.28 Round 16

上完 whk 回来了!!!

看 T1,会了 ai11,随便写了一下过了样例,交上去 0 分。写暴力,暴力 T 了。拍拍拍,调调调,拍拍拍,调调调,一个小时的时候才过 ai11

然后感觉 B 长得很小清新,感觉像签到题,但是完全不会做构造,只会前三个包,想想想,根本不会,破防了!

然后弃疗开始写,写完看 T3,但是根本不想做,随便拼了点包,A 性质被我瞎搞过了第一个包。

然后回来看 A,编了个策略,感觉能过 ai1,写写写,拍拍拍,调调调,拍拍拍,调调调,然后过了。

斩获了整整 63 分,然后一点不会,下班!

发现 B 没人过,失策了。

A 最后的晚餐

暴力可以做到 O(3(n+12)/3)

先考虑 f(A) 的求解方式。

对于 ai11,有策略:

  • 如果当前前缀和末尾不是 9,那就放 11
    • 否则,如果存在,任意选择一个数放上去。
    • 否则,放 11

      直接 DP 可以做到平方,但是 f(A) 存在更简单的形式。如果到不了 1.2,那么可以取到上界 S/10,其中 S 是所有数的和。否则,可以取到另一个上界 n。于是,答案是 min(S,n)

ai12 的问题在于 1 未必能够完成进位。如果只有偶数和 1,则答案有上界 nc1/2。扩展这个结论,注意到只有奇数能够改变奇偶性,所以 1 如果想进位,必须和另外一个奇数配对。于是可以找到答案上界 nmax(0,c1c3c11)/2

以下给出构造:

  • 如果当前前缀和末尾小于 8,那么有 12 则放 12,否则使用上面的策略。
  • 如果当前前缀和末尾等于 8,那么:
    • 如果有偶数,放偶数。
    • 否则,放 11
    • 否则,放任意奇数。
    • 否则,放 1
  • 如果当前前缀和末尾等于 9
    • 如果有 1,放 1
    • 否则,放任意奇数。
    • 否则,放 11

随后可以 DP 解决。求出 h1(x,y) 表示偶数中选了 x 个数,和为 y 的方案。h2(x,y) 表示奇数个数减去 max(0,c1c3c11)/2x,和为 y 的方案数,需要计算:

h1(x,y)h2(z,w)(min(x+z,(y+w)/10)+1)

把后面的式子的 x+z 提出来,再通过讨论 ymod10+wmod1010 的大小关系,即可拆开暴力枚举,时间复杂度 O(n2)code

2023.11.30 Round 17

最后一把。

开场锁定 T2,想了半个小时发现会了 A 性质和 B 性质的麻烦做法,又想了一会发现 B 性质有好写一点的做法,只不过还是有点麻烦。先看看别的题。

看 T1,发现会用 2 的幂构造,然后就不会了/cf

看 T3,感觉非常混乱,编了个平方跑路了。

然后回来编 T2,暴力和 A 过得飞快,写 B 的时候发现好写做法假了/fn

急急急,然后又编了个做法,还是假的。绷不住了。

不过最后还是修出来了,修完直接摆烂了!

A 棋盘

感觉憨憨,可惜我不会构造/cf

最简单的构造是构造 2 的幂次。然后你其实可以考虑转化进制,构造出来 3 的幂次和 6 的幂次,比 2 的幂次优一点。

然后正解的构造是构造斐波那契数列,大概是先放两格,然后不停在外面围 4 个各自,然后求一下 k 的斐波那契拆分就好了。

posted @   yllcm  阅读(296)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示