Live2D

2023.2月份比赛记录

以上是挂分记录:

2023/2/1: 期望得分:100 实际得分:13

2023/2/2:期望得分:400 实际得分:100

2023/2/3:期望得分:220 实际得分:20

2023/2/4:期望得分:290 实际得分:185

2023/2/6:期望得分:300 实际得分 193

2023/2/7:期望得分:203 实际得分 153

2023/2/8:期望得分:305 实际得分:305

2023/2/9:期望得分:260 实际得分:220(被卡常了🙃🙃🙃)

2023/2/10:期望得分:225 实际得分:140(被卡常 \(70\) 分了😃😃😃而且T4考场上没有写完,又少了 \(85\) 了😏😏😏)

2023/2/13:期望得分:273 实际得分:223(细节丢分 \(50\) 哈哈哈哈写挂一点就爆炸🤯🤯🤯 还不给nm大样例😅)

2023/2/15:期望得分:344 实际得分:344

2023/2/16:期望得分:219 实际得分:210(文件名打错了,但是我是啥也的楪)

2023/2/17:期望得分:200 实际得分:95(我是佳佳的楪😃tmd,rand的范围在Linux下面是INT_MAX,在windows下是32767)

2023/2/20:期望得分:300 实际得分:290

2023/2/23:期望得分:300 实际得分:300

2023/2/24:期望得分:260 实际得分:230(题读错了,而且大家好像很多都读错了😯😯😯)

2023/2/25:期望得分:200 实际得分:43(T1 是假的,T2 puts No 的时候没有返回 0)

2023/2/27:期望得分:250 实际得分:230(shaber AK森,能不能去死啊🤬🤬🤬)

2023/2/28:期望得分:100 实际得分:100 (感谢wxk送的T2😄😄😄)

2023/3/1:期望得分:333 实际得分:90(前面 \(3\) 个题全挂了😅😅😅)


2023/2/1

哈哈哈,今天被T1卡了2个小时,后面才知道是nmsb剪枝题,写T2写假了大样例又很水还没有对拍,T3冲个 \(\mathcal O(n\log^2n)\) 考试也没有调出来,T4 看都没有看。🥰🤗🤡

T1

link

Description

给出一个大小为 \(n\) 的可重集,有 \(m\) 次操作,先后手轮流操作,每次可以选择保留 \(\equiv 0\pmod {b_i}\) 的权值,或是删除 \(\equiv 0\pmod {b_i}\) 的权值。先手想要答案尽可能小,后手想要答案尽可能大。问最后的结果。

\(n\le 2\times 10^4,m\le 2\times 10^5\)

Solution

假设 \(m\) 足够大。我们考虑对于先手来说,每次选择集合大小更小的一侧,那么无论如何都可以做到在 \(2\log n\) 次之后使得答案为 \(0\),所以最后答案一定 \(\le 0\),对于后手来说,也是同理,所以最后答案一定会 \(\ge 0\)。因此,答案一定 \(=0\)。对于 \(m\le 2\log n\) 的情况我们可以直接建个 \(\text{01trie}\) 暴力算。复杂度 \(\mathcal O(n\log n)\)

T3

link

Description

给出一个长度为 \(n\) 的序列。定义一个区间 \([l,r]\) 是好的当且仅当 \(\forall i\in [l,r],a_i\ge i-l+1\)。有 \(m\) 次操作,为以下两种之一:

  • \(a_x\) 修改为 \(p\)

  • 查询 \([l,r]\) 有多少个子区间是好的。

\(n\le 10^6\)

Solution

一个很蠢的 \(\mathcal O(n\log^2n)\) 是直接线段树分治,然后再用线段树维护每个 \(l\) 最多能够拓展到的 \(r\)。跟正解几乎没有什么关系。(似乎只要用了线段树分治想要进一步优化都很难了🤔

我们考虑另外一种方法。先对于整个序列考虑,我们发现对于 \(i\) 而言,设 \(b_i=i-a_i\),对于 \([1,b_i]\) 它们的合法 \(r<i\)。考虑计算贡献,假设 \(b\) 的前缀最大值位置为 \(p_{1,2,...,k}\),那么贡献即是 \(\sum (b_{p_k}-b_{p_{k-1}})\times p_k+\sum (n+1-b_{p_k})\times (n+1)\) (大概是这个意思,但是还需要减去左端点的贡献)

我们考虑用这个方法计算答案,对于一个位置,它是对于一个时间段会产生贡献,那么我们可以把时间轴离线,按坐标从左往右扫,然后对于时间去维护一个前缀最大值的势能线段树。复杂度即为 \(\mathcal O(n\log n)\)

T4

link

Solution

to be done.

2023/2/5

又被sb题橄榄了😅

link

T2

Description

\(2m\) 个区间,保证互不相同。需要构造一个长度为 \(n\) 序列 \(a_{1,2,...,n}\) 使得恰好有 \(m\) 个区间内部存在相同的值。

\(n\le 2\times 10^5,m\le 10^5\)

Solution

先去掉长度为 \(1\) 的区间,因为它们一定没法满足内部存在相同的值,我们考虑这样一种构造,先把区间按左端点从小到大,右端点从大到小排序,然后假设第 \(m\) 个区间为 \([l,r]\)。我们一开始先把 \(a_i\) 都设为 \(i+1\),则把 \([1,l]\cup[r,r]\) 设为 \(1\)。可以发现一定合法。

T3

Description

问长度为 \(n\),字符集大小为 \(C\) 的字符串有多少个内部不存在长度为 \(K\) 的回文串。答案对 \(998244353\) 取模。

\(n\le 5000,K\le 25,C<998244353\)

Solution

map的比较函数相同要返回值!!! 😡😡😡

我们考虑一种暴力做法,我们可以从前往后扫过去,然后记录最后 \(K-1\) 个字符的情况。可以优化一下状态,复杂度就是 \(K\) 的整数划分 \(\times n\) 的。

发现没有办法优化。我们考虑容斥,那么我们搜索状态的时候,我们就不再要求知道每一个位置具体跟哪些位置是相同的,只有在钦定要求是回文串的时候我们才需要处理一下。那么加入一个位置就最多只有两种转移状态。然后状态数就大约是 \(2^K\) 的了,实际上只有 \(9\times 10^4\) 个状态。统计答案的话我们可以在相同值的末尾处理,即加入一个值踢出一个值的时候,如果踢出的值不再出现,就统计一个 \(C\) 的贡献。

T4

太sb了,懒得写了。🤗🤗🤗

2023/2/7

link

T1

Description

给出 \(n\) 个坐标 \((x_i,y_i)\),要求构造长度 \(\le 40\) 的序列 \(a_{1,2,...,m}\),使得对于每个坐标,都能被构造出来。构造出来指的是每个 \(a_i\)\((\pm 1,0),(0,\pm 1)\) 中选一个乘积的和为 \((x_i,y_i)\)

\(n\le 1000,|x_i|,|y_i|\le10^9\)

Solution

构式题目🤮🤮🤮

首先判无解一定是看 \(x_i+y_i\) 的奇偶性是否相同。然后一种sb构造方法是对于 \(x_i,y_i\) 分别构造,然后二进制下从后往前扫。跟正解没有任何关系。😏😏😏 考虑合在一起构造,\(a\) 还是选 \(2^i\) 以及 \(1/2\)\(1\),每次选绝对值大进行处理,如果比 \(>0\) 就减,否则就加。正确性不太清楚。

sb pb,明明 \(n\log v\) 非要 tmd \(n\)\(1000\)😬😬😬

T3

Description

给出一个大小为 \(n\) 的树,每个点有权值 \(w_i\),定义树的价值为一条链的最长上升子序列长度的最大值。求删掉一个点(需要自己枚举)之后的最小权值。

\(n\le 5\times 10^5\)

Solution

其实是可做题,但是 T2 卡常卡太久了没有办法仔细想😥😥😥

我们不妨找到一开始的最长价值的链的两端,不妨记为为 \(x,y\),那么我们一定会删除一个在 \(x\to y\) 上面的节点。那么我们暴力做的话就是枚举一个节点然后计算删除它的贡献。可以看出的是,我们只需要计算以 \(x,y\) 为根时每个子树的贡献上面这个东西就是可做的。然后用长链剖分维护一下即可。

复杂度 \(\Theta(n\log n)\)

2023/2/8

link

T3

Description

给出一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\),定义一个区间 \([l,r]\) 为好区间当且仅当 \(\min a_x\le r-l+1\le \max a_x\)。求把这个数列划分成若干个好区间的方案数。\(n\le 5\times 10^5\)

Solution

虽然很sb,但是考试的时候还是没想到😇😇😇直接中点分治转移dp即可,枚举一下最大值在哪边就好了。

T4

Description

给出一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\),求有多少种不同的区间的值构成的集合。每个元素仅出现最多 \(2\) 次。\(n\le 5\times 10^5\)

Solution

定义 \(b_i\)\(a_i\) 出现的另外一个位置。我们考虑先计算极大的区间数量,指的是满足 \(b_{l-1}\not \in [l,r]\wedge b_{r+1}\not \in[l,r]\)\([l,r]\) 个数。这个东西可以直接二维数点。然后如果两个区间 \([l_1,r_1]\)\([l_2,r_2]\) 都是极大的且集合相同时会算重,但是在 \(r_1=l_2-1\) 的时候不会。

注意到 \([l_1,r_1]\)\([l_2,r_2]\) 肯定是没有交的,那么假设 \(r_1<l_2\),我们相当于 \(\max_{x\in [l_2,r_2]} b_x-\min_{x\in [l_1,r_1]}-(r_2-l_2)=0\) 的时候 \(l_2,r_2\) 会算重。那么我们可以从右往左枚举 \(l_2\),用单调栈和线段树维护每个 \(r_2\) 的最小值去处理。记得 \(r_1<l_2-1\) 即可,即 \(\max_{x\in [l_2,r_2]} b_x<l_2-1\) ,二分一下就好了。

复杂度 \(\mathcal (n\log n)\)

2023/2/9

link

哈哈哈哈哈T1调了2个小时,最后还被卡常了 \(40\) 分,哈哈哈哈哈哈哈🥳🥳🥳🧐🧐🧐

T3

Description

对于一个排列 \(p_{1,2,...,n}\) 定义其权值为每个点最近的点到它的距离之和。假设 \(a_0=a_{n+1}=\infty\) 。求长度为 \(n\) 的排列,权值为 \(x\) 的有多少个。

\(n\le 200,x\le 10^9\)

Solution

sbtr,连离线下去处理都不会,好似🤣🤣🤣

我们可以设 \(f_{t,s}\) 表示长度为 \(t\) 的序列,权值为 \(s\) 的方案数。可以发现我们可以枚举最大值位置,那么转移式就是:

\[f_{t,x}=$\sum_{x=1}^{n} \sum_{s_1} f_{x-1,s_1}f_{t-x,s-\min(x,t+1-x)-s_1}\binom{n-1}{x-1} \]

一个事情是我们可以发现合法的 \(x\) 一定是 \(\le n\log n\) 的,这个可以通过启发式分裂看出,每次最大值放中间取得。不过实际中是 \(\le 4n\) 的。这个时候我们已经可以离线下来暴力预处理了。用 __int128 减少取模次数即可通过。

不过一种更为优秀的方法是,我们可以发现转移是卷积形式,那么我们可以只暴力点值,最后再拉格朗日插值插回去求到答案。复杂度 \(\mathcal O(n^3\log n)\)。(这里视 \(x\)\(n\) 为同一量级)

T4

Description

给出一个长度为 \(n\) 的字符串,有 \(q\) 次查询,给出一个区间 \([l,r]\) 问本质不同的子串种该区间出现次数之和。

\(n,q\le 4\times 10^5\)

Solution

哈哈哈哈哈哈哈,看了1个小时啥也不会,sb是这样的😋😋😋

我们首先转化一下题意,变成在 \([l,r]\) 所代表的字符串(不妨设为 \(x\))前面和后面加字符,不同的加法数量。不同指的是前面或者后面加的不一样。

然后我们就相当于后缀树上 \(x\) 的子树中DAG上能到节点的状态和。这个随便做一下就好了。复杂度 \(\mathcal O(n\log n)\)

2023/2/10

link

T1

Description

给出一个长度为 \(2n-1\)\(01\) 交替串,每次可以选择一个以 \(1\) 开头和以 \(1\) 结尾的 \(01\) 交替串进行 \(01\) 翻转。问有多少种进行 \(K\) 次操作的方案数。

\(n,K\le 10^6\)

Solution

对着找规律找出来的递推式看了 \(1\) 个小时啥也看不出来😊😊😊我是废物

可以看出的是,题目相当于一个长度为 \(n\) 的串,每次选一个区间,然后分为三个区间,中间减少一个。注意到这个可以表示为一个树形结构,即一个三叉树,最后就会有 \(2K-1\) 个叶子。而每次会减少一个点,所以最后会有 \(n-K\) 个点。先考虑把点放进叶子里面,那么方案数就是 \(\dbinom{n+K}{2K}\)。然后考虑如何计算树形结构,考虑从下往上构造,那么每次相当于连续三个区间合并起来,那么方案数就是 \((2K-1)!!\)

哈哈哈哈哈哈,做不出来🙂🙂🙂

T3

Description

给出 \(n\) ,定义两个点相邻当且仅当仅有二进制上仅有一位不同,你需要构造出一个长度为 \(2^n\)\(01\) 串,使得每个点与它相邻且颜色相同的点数 \(\le \lceil \sqrt{n}\rceil\)。并且 \(0,1\) 个数不同。

\(n\le 22\)

Solution

一个不保证 \(0,1\) 个数不同的做法是直接根据二进制下 \(1\) 的个数的奇偶性赋值。考虑构造一个函数,使得变化 \(1\) 位时值最多变化 \(\lceil \sqrt{n} \rceil\) 个,然后每个点的颜色异或上函数值。那么一个妙妙想法是对于 \(n\) 分块,二进制下包含连续至少连续一块时函数值为 \(1\),否则为 \(0\)。正确性是显然。

怎么说捏?这种题做不出来或许是情有可原的,不过这个提示还是很明显的,只是我是个寸寸地飞舞😛😛😛

2023/2/13

link

T3

Description

给出一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\),每次等概率地合并相邻两个 \(a_x,a_y\),有 \(\dfrac{a_x}{a_x+a_y}\) 地概率合并成 \(a_x\)\(\dfrac{a_y}{a_x+a_y}\) 地概率合并成 \(a_y\)。问最后合并成每个点地概率。

\(n\le 500\),答案对 \(998244353\) 取模。

Solution

一个 naive 的 \(\mathcal O(n^5)\) 做法是设 \(f_{l,r,x}\) 表示 \([l,r]\) 这个区间合并成 \(x\) 的概率。然后可以前缀和优化做到 \(\mathcal O(n^4)\)

我们考虑到一个区间 \([l,r]\) 的被选出来的元素 \(x\) 它一定碰谁谁输,所以 \([l,x]\)\([x,n]\) 是独立的。那么我们就可以求 \(f_{l,r,0/1}\) 表示 \([l,r]\) 这个区间最后选到 \(l/r\) 的概率。随便优化一下就可以做到 \(\mathcal O(n^3)\)

bunny 对此锐评到:套路题。🥴🥴🥴果然我是个飞屋

T4

Description

\(n\) 个小石堆,每个堆有个颜色,以及它有 \(K\) 种可能的大小取值。有两个轮流操作,每次可以做以下两种操作之一:

  • 从一个石堆中取任意个石子。

  • 从同一颜色的石堆中选 \([1,m]\) 个石子。

无法操作的时候为输。问有多少种方案使得先手必胜。 \(n,m\le 20,\sum K\le 10^5\)

Solution

观察题目,题解里面没有证明🧐🧐🧐

首先可以看出颜色之间相互独立。设最后选的为 \(a_{1,2,...,n}\) ,然后设 \(a_i=b_i\times (m+1)+c_i(0\le c_i\le m)\),对应的 \(\text{SG}\) 函数即为:

\[\bigoplus b_i+(\sum c_i)\pmod{m+1} \]

然后随便 FWT 算一下就好了。难点在于找到规律🐭🐭🐭

2023/2/15

link

T1

Description

一开始有 \(n\) 个人,每次会从还剩的人里面选一个钦定踢出去,然后剩下的人有 \(p\) 的概率被非钦定踢出去。问一个被确定的人是第 \(i\) 个被钦定踢出的概率。

\(n\le 2000\),对 \(258280327\) 取模(为大质数)。

Solution

md,什么sb题都做不出来了😅😅😅而且sb题面还tm写得模糊不清😆😆😆

一个重要的事情是这些人都是相同的。我们考虑先转化一下题目,相当于我们钦定一下它们被踢出的顺序(非钦定也加入),然后对于当前的节点它有一定概率被前面的已经踢掉了,也有可能还没有,这个时候就钦定踢出去。而我们的人在这个序列中的位置是均匀随机的,所以可以统计所有答案再乘上 \(\dfrac{1}{n}\)

那么记录一下前面有多少个是被钦定踢出的,直接 dp 一下就好了。复杂度 \(\mathcal O(n^2)\)。感觉这个题的难度在于找到一个正确且均匀的转化🤔🤔🤔如果去枚举哪些是被钦定踢出的话就不均匀了,还是需要积累一下这类 trick。

T3

Description

给出两个 Treap 树,大小为 \(n,m\),可以对两棵树进行 \(q\) 次 rotate 操作,每次操作后问两个子树按 fhq_treap 合并方式合并后的 treap 的深度和。(两个节点合并时合并到子树大的节点)

\(n,m,q\le 2\times 10^5\)

Solution

注意到原先每棵树深度和是可以快速维护。我们可以考虑去计算更改量。发现实际上这个只跟左树的右链以及右树的左链上的子树大小有关,我们设这两个递减序列为 \(A,B\),那么 \(A_i\) 产生的额外贡献次数就是 \(B\) 序列中有多少个在 \((A_i,A_{i-1}]\) 里面,\(B_i\) 产生的额外贡献就是 \(A\) 序列有多少个在 \([B_i,B_{i-1})\) 里面。那么可以发现一次 rotate 操作只会修改常数个 \(A,B\),维护的话可以直接用个值域线段树,随便做一下就好了。

复杂度 \(\mathcal O(n\log n)\)

还有另外一种非常 sb 的 LCT 暴力链修改的做法,这里就不说了。😏😏😏

2023/2/17

T2 [CEOI2005] Ticket Office

link

Solution

其实不难,但是被数据范围迷倒了🐵🐵🐵

可以看出的是,我们应该是尽可能选 \(2\) 就选 \(2\),在此基础上面尽量多选 \(1\)。然后直接 dp 一下就好了。考试的时候发电了🤗🤗🤗

T3 CF1726G A Certain Magical Party

link

Solution

其实也不是很难,但是考试的时候读错题了(儿子出的题,原谅它了),以为不可做就弃了😋😋😋

分析一下性质,可以发现最后一定都会变为 \(t=\min v+n-1\),而且每个 \(x\) 最多只会出现 \(<x,1>\) 一次,然后还有:

  • 对于 \(<x,0>\),需要有 \(t-x\) 个小于 \(x\) 的放它后面

  • 对于 \(<x,1>\),需要有 \(x-\min v\)小于等于它的在它后面。

那么直接 \(x\) 从小到大考虑,从后往前相同的 \(x\) 先放 \(<x,0>\) 再放 \(<x,1>\)。相同的答案乘个阶乘即可。复杂度 \(\mathcal O(n)\)

2023/2/20

link

T3 [ARC112E] Cigar Box

Solution

其实不难,不知道为什么没有想出来😥😥😥 注意到我们其实只关心每个数最后一次操作的时间以及方向,那么原序列就可以被分成三部分,分别是 \([1,l],(l,r),[r,n]\),也即是说 \([1,l]\) 是靠移动到位置 \(1\) 形成的,\([r,n]\) 是靠移动到位置 \(n\) 形成的。\((l,r)\) 中间不会进行任何操作,所以需要保证它们单调递增。

考虑如何去统计方案,可以发现因为我们最后的 \(a_{1,2,...,n}\) 是固定的,所以它们 \([1,l],[r,n]\) 最后一次操作的相对关系是已知的,而除了一次操作,一个数的别的操作方向都是任意的,所以答案即是:

\[\sum_{l,r} \begin{Bmatrix} m\\l+r\end{Bmatrix}\binom{l+r}{l}2^{m-l-r} \]

随便算一下就好了。复杂度 \(\mathcal O(n^2)\) 的。

T4 gym104128 Proposition Composition

link

Solution

纯口胡,没写🤗🤗🤗

可以发现对于当前未被覆盖的,它选别的任意一条边都是合法的。考虑选了一条额外边,那么只能再选一个只被它覆盖的一条链边。这两个可以用set之类的维护一下。

那么我们现在考虑两条被覆盖的链边,发现当且仅当它们被覆盖集合相同时合法。那么用启发式分裂维护一下相同覆盖集合的点就好了。用链表可以做到复杂度 \(\mathcal O(n\log n)\)

2023/2/23

link

T1

之前场切的题目切不掉了🥰🥰🥰

T2

Desription

问长度为 \(n\) 的排列 \(p_{1,2,...,n}\) 满足其逆序对数为 \(k\)\(p_{p_i}=i\) 的个数 \(\% 2\) 的结果。

\(n\le 4000,K\le \dfrac{n(n-1)}{2}\)

Solution

做不出来罪不在我😌😌😌

我们需要发现的是,一个排列与其逆排列的逆序对个数是相同的,证明是显然的。然后注意到我们要求的排列满足其逆排列等于其自身。所以我们直接对所有排列计数,满足条件的排列只会计算一次,而其余的会与其逆排列抵消。

那么我们只需要知道逆序对数为 \(K\) 的排列的奇偶性。这个东西可以发现即是求:

\[[x^K]\prod_{i=1}^{n} \dfrac{1-x^i}{1-x} \]

那么用 bitset 优化一下就可以做到 \(\mathcal O(n^3/\omega)\) 了。

T3

Description

有一个 \(n\) 个点的树,每个点有颜色,有 \(q\) 次查询,每次查询一个 \([l,r]\) 构成的每个联通块的根的不同颜色个数。

\[n\le 10^5,q\le 10^6 \]

Solution

带权莫队板子题目,但 是 不 会 😏😏😏。考虑直接对于度数分块,考虑设置阈值 \(B\) ,对于度数 \(\ge 2B\) 的我们单独成块,其余的我们只需要保证每个块的度数和在 \([B,2B)\) 即可。

我们考虑直接这样莫队,考虑证明其复杂度。类似于回滚莫队的分析,右端点的移动肯定是 \(\mathcal O(n^2/B)\) 的。然后考虑左端点,对于度数和 \(< 2B\) 的块,它们怎么移动都是 \(\mathcal O(nB)\) 的,对于单点成块的点,它们显然作为左端点只会加入/删除一次,所以它们是 \(\mathcal O(n)\)

\(B\)\(\sqrt n\) 的时候我们就可以做到 \(\mathcal O(n\sqrt n)\) 了。

2023/2/24

兔子切穿了😛😛😛

link

T3 CF1540C2 Converging Array (Hard Version)

Solution

我们发现,其实就是差分之后一个位置如果 \(<l_p\) 那么就会修改到 \(l_p\),不过前后也会影响。那么可以注意到的是如果一个位置满足 \(b_{p+1}-b_p>l_p\) 说明它一定是没有被修改过的位置,如果我们可以找到最小的这样的 \(p\),那么我们就可以发现存在:

\[f_1\times p+\sum_{i=1}^{p} (p-i)b_i=\sum_{i=1}^{p} a_i \]

我们设 \(sa_p=\sum_{i=1}^{p} a_i,sb_i=\sum_{i=1}^{p} (p-i)b_i\),那么有 \(f_1=\dfrac{sa_p-sb_p}{p}\)

注意到问题是我们不知道 \(p\) 的位置,但是很显然我们可以取它们的 \(\min\),因为如果不是的话那么一定会 \(>f_1\),所以可以得到:

\[f_1=\min_{p=1}^{n} \dfrac{sa_p-sb_p}{p} \]

然后我们就可以做到 \(\mathcal O(qn^2m)\),其中 \(m\)\(\max c\)

注意到一件事情为,假设我们查询为 \(x\),当 \(i\cdot x+sb_i>i\cdot m\) 的时候一定无解,所以可以去掉查询 \(x>\min \dfrac{i\cdot m-sb_i}{i}\) 的情况。另外,如果对于所有 \(i\) 都有 \(i\cdot x+sb_i\le 0\),那么所有方案都是合法的。所以,我们只需要处理 \([\min (\dfrac{-sb_i}{i}),\min (\dfrac{i\cdot m-sb_i}{i})]\) 的答案。那么我们就可以做到 \(\mathcal O(n^2m^2)\) 了。

T4 [APIO2016] 烟火表演

Solution

我们可以设 \(f_u(x)\) 表示以 \(u\) 为根的子树每个叶子到 \(u\) 的距离都变为 \(x\) 的最小代价。大概可以猜测到这玩意是一个下凸函数?🤔🤔🤔

我们考虑每次合并,注意到:

\[f_u(x)=\sum_{(v,w)} \min_y f_v(y)+|x-(y+w)|(y\le x) \]

我们可以对于每个 \((v,w)\) 进行考虑,即每个 \(x\) 选到哪个 \(y\) 最优。我们可以假设下面的平台是 \([L,R]\),又因为斜率都是整数,那么左右两边要么 \(\le -1\) 要么 \(\ge 1\) 的。所以可以得到:

\[F_u(x)=\left\{ \begin{aligned} f_v(x)+w (x\le L) \\ f_v(L)+(L+w)-x (L\le x\le L+w) \\ f_v(L) (L+w\le x\le R+w) \\ f_v(R)+w-(R+w) (R+w\le x) \end{aligned} \right. \]

然后我们发现我们就可以去维护拐点进而维护凸包了,然后 \(f_1(0)\) 又是边权之和,所以就可以直接求了。维护拐点可以使用可并堆维护。复杂度 \(\mathcal O(n\log n)\) 的。

2023/2/25

哈哈哈哈,T1假了结果调了 3 个小时😄😄😄😄 T3,T4看都没看,少打一堆分😅😅😅😅感觉应该有很多人也是这样把🤔

T3 [ARC146E] Simple Speed

link

Solution

我们可以考虑按值域从小到大加入,那么每次加入 \(i\),就必须放在两个 \(i-1\) 之间,且任意两个 \(i-1\) 都需要放,所以我们就可以设 \(f_{i,j,u,v}\) 表示现在考虑到了 \(i\)\(j\) 个相邻的 \(i\)\(u,v\) 分别表示最左/右边是否需要加入。

可以发现的是 \(j\) 能选的范围很小,所以直接这样 dp 就好了。复杂度 \(\mathcal O(n)\)

T4 [ARC150F] Constant Sum Subsequence

link

Solution

我们设 \(\text{nxt}(i,x)\) 表示在 \(i\) 之后出现的第一次 \(x\) 的位置,\(\text{pre}(i,x)\) 同理,这玩意可以随便做到 \(\mathcal O(\log n)\)。那么我们可以设 \(f_s\) 表示前面的和为 \(s\) 所需的最小代价,可以发现转移式为:

\[f_s=\max_x \text{nxt}(f_{s-x},x) \]

然后我们考虑如何优化。考虑分治。每次考虑 \([l,mid]\)\([mid+1,r]\) 的贡献。我们考虑每一个 \(x\in [1,r-l]\),一个显然的事情是我们只需要考虑那些 \(f_i\ge \text{pre}(f_{mid},x)\)\(i\),因为对于 \(f_i<\text{pre}(f_{mid},x)\) 它这个一定不会是最大值,至少有 \(\text{nxt}(f_{mid},i+x-mid)\) 比它大。然后发现可以转移的 \(i\) 转移到的点都是一样的,那么就相当于一个区间取 max,然后单点查询。直接线段树维护一下就好了。

复杂度 \(\mathcal O(m\log^2 m)\)

2023/2/27

link

T2

Description

给出一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\),满足 \(a_i\le m\),每次可以选择 \(1\le x,y\le n,x\not=y\),操作使得 \(a_x\to a_x-a_y,a_y\to 2\cdot a_y\),问能否在 \(8.5\times 10^5\) 次内使得整个序列只有两个位置不为 \(0\)

\(n\le 3\times 10^5,m\le 10^10\)

Solution

shaber AK森真是太厉害啦!🥰🥰 爷不补了 😛😛😛

T3 CF1610G AmShZ Wins a Bet

link

Solution

其实不是很难,不知道为什么没有想到😅😅😅

我们可以发现的是如果删除了 \(l,r\) 那么我们一定会删掉 \([l,r]\) 整段区间,因为中间有空位的话可以通过替换把空位换到两端,并且不会更劣。知道这个性质之后我们可以设 \(f_i\) 表示考虑 \([i,n]\) 之后保留的字典序最小字符串,设 \(r\)\(i\) 对应合法区间右端点,那么有:

\[f_i=\min(f_{i+1}+s_i,f_{r+1}) \]

然后你发现可以用倍增维护 hash 值去判断。复杂度 \(\mathcal O(n\log n)\)

T4 可爱路径

link

Solution

给出一个 \(n\) 个点 \(m\) 条边的带权单向图,有 \(k\) 条路径是不能经过的,问 \(1\to n\) 的最短路。

\(n,m\le 2\times 10^5\)

Solution

可以看出其实就是 AC 自动机上面直接跑,问题在于暴力建边复杂度爆炸了。发现边从 fail 边的改变是 \(\mathcal O(\sum p)\) 级别的,所以我们可以用主席树去维护每个点到的边的情况,然后跑 Dijkstra 即可。主席树上一个区间都被松弛过了就忽略掉就好了。

复杂度 \(\mathcal O(n\log n)\) 的。

2023/2/28

link

T2

Description

给出 \(n\) 个数 \(a_{1,2,...,n}\),对于每个 \(x\in [0,2^m)\),求出:

\[\min_{i\not= j}\{|(a_i\otimes x)-(a_j\otimes x)|+(a_i\otimes a_j)\} \]

\(n<2^{23},m\le 24\)

Solution

结论题,不知道为什么大家都做的出来🤔🤔🤔

结论即为:只有 \((a_i\otimes a_j)\) 最高位最小的的对数才是有用的。证明懒得写了。然后有用的可以看出就是 \(a_{1,2,...,n}\) 排序之后的相邻两项,这个是显然的,最小值一定会在相邻两项中取到,具体证明可以在 trie 上面证明。

\(h=\min \{\text{heighbit}(a_i\otimes a_{i+1})\}\)(排序后),因为你只关心 \(x\) 的最后 \(h\) 位,然后注意到会考虑到的对数只有 \(2^{m-h}\) 个,否则根据鸽巢原理 \(h\) 会减少,然后直接暴力算复杂度就是对的了。复杂度 \(\mathcal O(2^m)\)

T3 [AGC017F] Zigzag

Solution

我们发现直接暴力去加入每个线用类似于轮廓线的方法,可以做到 \(\mathcal O(nm^22^n)\),我们需要记录上一次的变化方式以及在当前高度上一次的位置。考虑复杂度的瓶颈,发现在于记录上一次的位置,发现其实可以不用记录,我们改变一下我们的状态,定义为可以变化的规则,值的是当前位为 \(0\) 时表示可以走 \(0/1\),为 \(1\) 的时候只能走 \(1\)。那么我们考虑当前位为 \(0\),然后走了 \(1\) 的变化,发现直接把下一个 \(1\) 删掉就好了。

复杂度 \(\mathcal O(nm2^n)\)

2023/3/1

link

T3

Description

给出一个 \(n\) 个点的 \(\text{DAG}\),有 \(q\) 次查询,每次查询到一个点不是一个钦定集合中的点的最大距离。

\(n\le 10^5\)

Solution

直接根号分治即可,不知道为什么没有想到。🤗🤗🤗

posted @ 2023-02-01 21:30  Dark_Romance  阅读(188)  评论(0编辑  收藏  举报