2024 Summer mx Trainning

vjudge 题单

7.14 Day -2

也是出门了,东营没有高铁,坐绿皮车坐了 \(8\) 个小时,到了北京。怎么刚下火车就出期末考试成绩的?全死了,不想提。。晚上去了水立方鸟巢那里,奥林匹克公园吧,薛之谦还有演唱会在那。

7.15 Day -1

上午出发去了地坛,主要是看了课本里史铁生写的我与地坛片段想去看看啥样,实际上没啥嘛,公园也不大,还挺热的。中午去了大悦城,买了点谷子(我超,结束乐队)。下午去天坛。感觉比地坛好多了,种了好多树!都得好几百年的老树了。至于里面的景点倒是没啥看的,人太多也太热了,在公园里倒是挺舒服的。

晚上就去学校了,好惨啊,晚上九点发手机十点交手机还不能把电脑带回去,管这么严的。还好我自有妙计

7.16 Day 1

怎么会有人模拟赛的时候电脑死了啊?硬盘坏了。。拿去修了。。

太蠢了怎么一个都不会做?补了 T1 和 T3。

T1 CF425E Sereja and Sets 首先贪心地,肯定是按照左端点从小到大排序,选右端点最靠左的这样子。设 \(f_{r,c}\) 表示当前最靠右的右端点是 \(r\),并且选了 \(c\) 条。从 \(r,c\) 转移 \(r',c+1\) 时,考虑两种情况,一种是左端点在 \((r,r')\) 右端点在 \(r'\) 的线段,这种必须选的;另一种左端点同理,右端点大于 \(r'\),可选可不选。处理转移系数即可。

具体一点的话,右端点在 \(r'\) 的线段有 \(r'-r\) 条,其他的有 \((n-r')\times (r'-r)\) 条。必须要选一条用来贡献到 \(c+1\),其他的随便选,反正都会被去重,所以转移系数是 \((2^{(r'-r)}-1)\times 2^{(n-r')(r'-r)}\)。减一就代表着必选。

T3 CF1371F Raging Thunder 这个有点太蠢了,我一点都没思考,我不知道是不是电脑炸了搞我心态了,还有可能是太困了?不会应该不至于吧。总之是 \(\texttt{>}\) 看作 \(0\),\(\texttt{<}\) 看作 \(1\),然后线段树维护区间极长 \(000111\) 串即可,还有区间翻转也是容易的,不过写起来感觉恶心,讨厌 DS。

7.17 Day 2

上午是专题练习,下午讲的树上问题。还有薛之谦新歌哦,守村人,好听的。

CF906C Party

这个就直接状压就好了。

设 \(f_S\) 表示让集合 \(S\) 里的人成为朋友的最少次数,初始每个人各自的朋友集合答案为 \(1\)。

转移就先枚举集合 \(T\),再枚举 \(x\in T\),设朋友集合为 \(a_x\),那么 \(f_{T|a_x}=\min(f_{T|a_x},f_T+1)\)。

mx 没搬输出方案,我也就没写。应该随便写的吧。

CF757D Felicity's Big Secret Revealed

仔细算一下的话,你的最大值不会超过 \(20\),所以可以状压,设 \(f_{i,S}\),表示上一次选在第 \(i\) 个数前,选用的数字集合为 \(S\),转移比较简单,统计答案直接统计那些 \(S=2^x-1\) 即可。

ARC171D Rolling Hash

究竟如何想到的啊?可能是我根本就不会 hash 吧。

正常我们求字串 hash 值都是用前缀相减:

\[hash(l,r)=pre_r-pre_{l-1}\times B^{r-l+1} \]

而模 \(P\) 与 \(0\) 同余就意味着:

\[pre_{l-1}\times B^{r-l+1}\equiv pre_r\pmod P \]

这样显然不好操作。而如果转为后缀的话:

\[\begin{aligned} suf_l&=\sum\limits_{i=l}^nA_i\times B^{n-i}\\ suf_{r+1}&=\sum\limits_{i=r+1}^nA_i\times B^{n-i}\\ hash(l,r)&=B^{r-n}(suf_l-suf_{r+1}) \end{aligned} \]

于是:

\[hash(l,r)\equiv 0\pmod P\Rightarrow suf_l\equiv suf_{r+1}\pmod P \]

巧妙地规避了 \(B\) 的限制。我们可以直接在 \(l_i\) 和 \(r_i+1\) 之间建边,对于一条边的两个端点并不能染成同种颜色,最多 \(P\) 种颜色,问能否合法染色。

注意到 \(n+1\) 也是要建出来的,虽然没有这个后缀。因为第 \(n+1\) 个点限制了与之有边相连的点颜色种类数最多只有 \(P-1\) 种,因为都不能和 \(n+1\) 相同,如果认为 \(n+1\) 没有实际意义,就不要这个点了,那么如果其他点连来连去搞出 \(P\) 种颜色,就爆了。

P4359 [CQOI2016] 伪光滑数

最大的伪光滑数一定是所有质因子都相同。易证。那么把 \(128\) 以内的质数的所有小于 \(N\) 的次幂都放到一个大根堆里,每次取出堆顶,删去一个最大的质因子(只剩一个则不删,因为会破坏 \(a_k^k\le N\) 的限制)加入一个小的(注意不一定是次小的),直到 \(K\) 次。不过说实话很容易就弄重了,没搞懂怎样严谨,感觉不如开个 set 去重。。

CF1709E XOR Tree

显然路径异或和就是端点到根异或和的异或和,并且我们一定是有合法的修改方案的,因为值域是很大的,不过我也不会严谨证明。
接着贪心地从下往上考虑修改每一个点,这样比从上往下能影响到的点更多。
设每个点到根的异或和为 \(d_i\),当前是点 \(u\),且子树内有两个点 \(x,y\),若 \(d_x\operatorname{xor}d_y\operatorname{xor}a_u=0\),那直接不用管这棵子树了,并且答案加一。具体地用 set 启发式合并即可。

CF293E Close Vertices

这个很套路,先点分然后二维数点,不过也确实学到了。没啥好说的。

7.18 Day 3

又是啥也不会的一天啊,妈的,暴力咋还写挂了??
也没咋补题,自闭了。

只补了 T1 发牌姬(card):

每个 \(1\) 之间间隔 \(m-1\),然后第一个 \(1\) 前面有 \(b\) 个 \(0\)。先判断一下每个串内的间隔,然后只保留前后缀。接着对于每个前缀 \(pre_i\),向 \(m-1-suf_i\) 连边,这样 \(m\) 个点,跑欧拉路径就行了,起点是 \(b\)。不过似乎是欧拉回路,不知道为啥。

7.19 Day 4

又是专题训练,下午讲的连通性,最友好的一集,讲的就一个没做过。

CF965E Short Code

建 trie 树,然后相当于每个串结尾是一个黑点,可以把黑点往上移,不能重叠,最小化深度和。直接 dfs,每个点用大根堆维护子树里面黑点深度和,贪心地把最深的往上移,回溯时合并到父节点。由于黑点只有 \(\mathcal{O}(n)\) 个,所以复杂度单 \(\log\)。

CF653E Bear and Forgotten Tree 2

先判断 \(1\) 的度数最多可以为几,不足 \(k\) 则无解。
接下来考虑 bfs,搜出有几个连通块,假设有 \(x\) 个,如果 \(x\le k\) 是有解的,否则无解。为保证复杂度可以用 std::set 存储没有访问过的点,走到后删除,不会分析复杂度,但是能过。

CF1260E Tournament

朋友是最后一个人的话不用管,否则必选最后一个人。他可以帮我们干掉 \(\frac{n}{2}-1\) 个人。如果这时候朋友排名大于 \(\frac{n}{2}\),就结束了;否则应该在这些人中挑出一个人,而这个人能干掉 \(\frac{n}{4}-1\) 个人......依此类推,我们只需要在从后往前的每个 \(2\) 的次幂出去一个后缀最小值就好了,注意不能重复,用优先队列即可。

CF623B Array GCD

有点厉害。

我们设整个序列最后的 \(\gcd\) 为 \(d\)。假设知道了 \(d\),那么设有序列 \(c\)。

  • \(a_i\bmod d=0 \Rightarrow c_i=0\)。
  • \((a_i+1)\bmod d=0 \operatorname{or}\ (a_i-1)\bmod d=0\Rightarrow c_i=B\)。
  • \(\operatorname{otherwise}c_i=-1\)。

然后分为两种:

  • 没有 \(-1\):

没有删除的硬性要求,所以先算上整个序列的 \(\sum c_i\),然后求一个 \(A-c_i\) 的最小子段和加上就好了。

  • 有 \(-1\):

找到 \(c_i=-1\) 的最左端和最右端,这段是一定要删的;之后在尝试向前或向后延申即可,具体用前缀和后缀和即可。

然后这是知道 \(d\) 的做法。注意到 \(m<n\),那么枚举 \(a_1,a_1+1,a_1-1,a_n,a_n+1,a_n-1\) 这 \(6\) 个数的质因子作为 \(d\),再利用上述方法计算即可~

CF1088E Ehab and a component choosing problem

发现 \(k>1\) 一定不优,所以第一问就是最大子树和。

第二问直接树形 dp,求出有多少个连通块大小等于第一问答案就可以了,注意第一问的输出要乘上第二问答案。

7.20 Day 5

模拟赛前三题咋都不会啊,第二问相邻三个的结论没看到,还好 T4 放的是和之前那个点分治几乎一样的题目,就多了个边双缩点,还只是一维偏序。爆肝两个半小时好歹是写出来了。

下午听讲也呼呼大睡,困死了。除了模拟赛题没讲别的,就随便看了看高维前缀和,有空单独写一个吧。

晚上可以带电脑回去,因为是周六,爽!

7.21 Day 6

休息日。虽然赵明建不让我出去,在宿舍玩也很爽!电脑还复活了。总之就是玩了一整天。

7.22 Day 7

比赛又是,犯困。。也只补了 T1。

A. 资源分配(resource)

这个直接贪心就可以了,按照 \(b_i\) 从大到小。用 set 维护一下还没用过的数的连续段。吐槽一下一开始写的用过的数,TLE。于是请教李泓毅,他说维护连续段,然后我就维护用过的数的连续段,这个是合并,细节较多,一直在挂。后来他说要是他写他就维护没用过的数,写了一遍过了。。

下午讲的 2-SAT,感觉建图还得练啊。。晚上全用来补 T1 和写这个 jb 博客了,没做下午的题。

这里是后来补的:

P6378 [PA2010] Riddle

设 \(in_i\) 表示选择点 \(i\),\(ex_i\) 表示不选。对于一条边 \((u,v)\),连边 \(ex_u\to in_v\),\(ex_v\to in_u\)。对于每一部分中的任意两点 \(i,j\),连边 \(in_u\to ex_v\),\(in_v\to ex_u\)。其实这样是至多选一个,但注意到假如一个都不选,我们随便选一个就行了,因为边的限制是至少,所以不影响。

不过这样子边数就爆炸了。考虑前后缀优化建图。对于每个点,新建出 \(pre_i,suf_i\)。在每个部分内,\(pre_i\to i,suf_i\to i,pre_i\to pre_{i-1},suf_i\to suf_{i+1}\),这样边数下降到 \(\mathcal{O}(n)\),再跑 2-SAT 即可。

7.23 Day 8

训练赛。ds 场。

P1712 [NOI2016] 区间

居然放这个。这个之前看过,但是没写。一开始还写假了/ll。
把区间按照长度从小到大排序,然后选的一定是连续的一段,双指针就好了,线段树维护区间最大值,用来看有没有一个数被覆盖了 \(m\) 次。

有一个细节是,其实有可能是两段拼起来的,不过这样加上中间的那些也不影响答案,这里不赘述了。代码里可能选了少于 \(m\) 段就算答案了,实际上这样一定不优,所以也不影响。

CF854E Boredom

二维数点就做完了,纯唐。

CF1696D Permutation Graph

ST 表维护最大最小值和位置,直接最值分治就好了。还有一种线性的做法,考虑从全局最大值或者最小值开始,每次肯定跳到下一个最低或最高的点,然后维护前缀后缀 \(\max\) 和 \(\min\) 就行了。

P9130 [USACO23FEB] Hungry Cow P

考虑线段树,首先要维护区间的 \(res\) 表示答案。显然没法直接合并,于是再维护一个 \(rem\) 表示剩下多少,\(num\) 表示区间里有多少天吃到了。后两者都可以 \(\mathcal{O}(1)\) pushup,而 \(res\) 需要单侧递归的技巧进行计算。有些细节是第一次算的时候很可能右儿子是空的可是当前有剩余,处理的方法是计一个 \(val\) 表示左子区间对右子区间的贡献,直接调用这个;还有就是递归到叶子时,如果有剩余,就直接返回编号,否则返回 \(res\),不过这个好像很显然/qd。

7.24 Day 9

模拟赛。

T1 就纯纯分讨,讨论了 1h,过了。T2 不会,以为自己打了 60pts,结果挂到 20pts。T3 听懂了没写,T4 没听懂,哦,T2 也没补。

下午讲反演,感觉豁然开朗,单独写了。

7.25 Day 10

擅长给自己树敌/fendou。

上午还是训练赛。只做了三道。下午没老师给我们讲课,就听着隔壁的直播,十分模糊,不好评价。不过也只讲了专题。看了一下午那个 CF17C,完全没看懂。。无语了。

CF1234F Yet Another Substring Reverse

CF1556E Equilibrium

CF1316E Team Building

不写了。

CF17C Balance

是否有些困难,看了一下午。

设 \(f_{i,a,b,c}\) 表示考虑到原串的第 \(i\) 位,其余记录的是答案串里的对应字母个数。

考虑转移,怎样才能不重不漏?我们实际上是枚举在答案串中下一个数填什么,那么就有两种可能,一种是当前字符复制,一种是后面字符复制过来。

记 \(nex_{i,0/1/2}\) 表示当前位置(包括)的下一个对应字母的位置,这样就把两种情况变成了一种情况。于是转移就是从 \(i\) 转移到 \(nex_{i,0/1/2}\),并让对应字母个数加 \(1\)。

为什么只转移到 \(nex\) 呢,这样是防止算重。字母只加 \(1\) 也是为了防止算重。

7.26 Day 11

今天真 tm 唐完了。。

昨天睡太晚了,导致今天困得要死,上午模拟赛完全没法思考。下午讲前三题也没听,呼呼大睡,只听了第四题,发现是简单题,不知道为啥不会。

T4 前六十分就是暴力 dp,妈的,noip2023 重现??然后发现把 \(p\) 和 \(1-p\) 互换不影响答案,可以递推了。特殊处理 \(p=\frac{1}{2}\) 的情况就行了。

下午也没讲,看了看同余最短路,写了那个子集反演的例题,实际上就是太摆了吧?状态真的不行,啥都不想干。。。。。emo

7.27 Day 12

模拟赛又又又犯困,一个题都没做,直接摆了。讲题也没听懂,今天困难场。

下午讲 ACAM。

P3041 [USACO12JAN] Video Game G

比较简单。建出 ACAM,考虑 fail 树的性质:如果一个串出现了,其结尾节点在 fail 树上的祖先一定也出现了。bfs 过程中,把当前节点的 fail 的结尾标记累加到当前节点。

接着 dp。设 \(f_{i,j}\) 表示输入了 \(i\) 个字符,并且走到了 ACAM 的第 \(j\) 号节点时的答案。转移顺着 trie 图的边转移就好。最后答案为 \(\max f_{k,i}\)。注意 dp 数组初值应为负无穷。

CF163E e-Government

也不难。

先建出 ACAM 和 fail 树。依然考虑 fail 树的性质,同上题。先考虑修改。一个节点会对其子树内所有节点产生贡献,那么只需要在结尾节点做一个子树修改。查询也就很简单了,只有单点查询。那么直接用一个 BIT 就做完了。

7.28 Day 13

耶耶耶又放假啦。但是凭什么宿舍插座不给充电?离谱 mx。上午随便睡到九点,玩了玩手机,下午来机房摆了。晚上还有晚自习。。

7.29 Day 14

今天感觉困难场,要不是 T3 数据弱我真没分了。

T1 CodeChef - FINDINGSUM

首先第一步转化是关键的,然而我完全想不到。想到了也不会插板法。

\(\sum|A_i-B_i|=\sum\max(A_i,B_i)-\sum\min(A_i,B_i)=\sum\max+\sum\min-\sum\min=2m-2\sum\min\)

设 \(s=\sum\min\),则 \(0\le s\le m\),所以可以先枚举一个 \(s\)。之后 \(A,B\) 的具体值就不重要了,只考虑 \(|A-B|\) 即可。

第一步是 \(n\) 个非负整数的和为 \(S\),根据插板法就是 \(\binom{n+s-1}{n-1}\) 种方案。

之后分配剩下的 \(m-s\)。分为两种情况:\(A_i>B_i\) 和 \(A_i\le B_i\)。先枚举大于的位置数量
\(x\),然后分别用插板法解决是 \(\binom{m-s-1}{x-1},\binom{n-x+m-s-1}{n-x-1}\),还要乘上 \(\binom{n}{x}\)。

复杂度 \(\mathcal{O}(nm)\)。答案为:

\[ans=\sum\limits_{s=0}^m\sum\limits_{x=0}^n(2m-2s)^2\binom{n+s-1}{n-1}\binom{n}{x}\binom{m-s-1}{x-1}\binom{n-x+m-s-1}{n-x-1} \]

T3 [ABC219F] Cleaning Robot

神秘题。

首先讲个笑话:梦熊数据跑 \(25\) 次就能过。

哎哎,简单写写吧。

先把第一遍模拟了,记录所有不重复的点,然后记最后的点为 \((a,b)\)。那其实所有点都在一条斜率为 \(\frac{b}{a}\) 的直线上移动。直接把刚才记录的点按照这个分类,再算一下每两个点之间有多少不在第一遍里的点即可。注意如果某个点不存在同类点,也就是每类最后一个点,要额外加上 \(k\),原因显然。注意负数取模和下取整与向零取整的问题。

T4 CF1732E Location

暂时没写,大分块/kel

7.30 Day 15

上午训练赛感觉比较杂吧,不好说。

CF1675G Sorting Pancakes

dp。就一个状态设计,\(f_{i,j,k}\) 表示前 \(i\) 个一共有 \(j\) 个,第 \(i\) 个有 \(k\) 个。想到了就做完了,可能再加一个后缀 \(\min\) 优化。

Interesting Trip - HackerRank

完全不会的题,yx 教的,拜谢 yx。

那直接引用 yx 的话吧:

到达不了 T 的点爬
记 f[u] 表示 u~T 字典序最小的路径的字符串
考虑把 f 倒着插入 trie, 每次转移是选一个 trie 上的节点加一个儿子作自己的 f
对于比较, 维护树上倍增的 hash 值, 倍增求出最长公共前缀比较之
找出最优转移.
n+m log n

比较唐的一点就是把 f[j-1][u] 写成了 f[u][j-1],调到三点多。

P10668 BZOJ2720 [Violet 5] 列队春游

其实比较容易。

\(i-pre_i\) 相当于 \(i\) 前面有几个严格小于它。那么把贡献均摊,每个 \(j\) 的贡献就是 \(1\)。

考虑每个 \(h\) 获得的贡献。设有 \(s\) 个比它小的 \(h'\),那么把剩下的 \(n-s\) 个数拎出来,他们是等价的,那些小于 \(h\) 的数也是等价的。于是有 \(n-s+1\) 个空隙,产生贡献的期望就是 \(\frac{1}{n-s+1}\)。再乘上 \(h\) 的个数累加即可。

7.31 Day 16

模拟赛 T1 放爆搜什么意思啊,但是一个地方没开 ll 挂了一半分/qd。

T1 CF448E Divisors

没啥好说的,搜就行了。

T3 Positions - CodeChef

如果把能满足条件的数对之间连边,那么只需要把在一个 scc 中的数排序,然后按原来的相对位置输出即可。但是这样边数爆炸。设 \(T=2^{20}-1\),那么把每个 \(a_i\) 向 \(a_i\oplus T\) 连边,也就是向补集连边。之后把小于 \(T\) 的每种状态都向子集连边。当然不可能向所有子集连边,于是只向去掉一个 \(1\) 的子集连边即可。注意边的方向不能改也不能建双向边。

下午讲博弈论,题没太在线,也没做。感觉这东西真的很神秘啊。

8.1 Day 17

训练赛,补的最多的一次/xk。

CF702F T-Shirts

先转化一下,然后平衡树,复杂度均摊一下。

CF19D Points

线段树套 set,不过空间过不去,改成线段树二分加 set。

P2801 教主的魔法
CF551E GukiZ and GukiZiana

两个没营养的分块题。

P4562 [JXOI2018] 游戏

组合题。。完全不会。

CF961F k-substrings

发现倒着做每次长度最多多 \(2\),然后 hash 一下多出来的合不合法不合法就减就行了,线性复杂度。

8.2 Day 18

不会不会不会。

T1 是 \((\max,+)\) 卷积背包。T2 一眼看上去和前两天问 yx 那个很像,然后我就以为不能直接贪,结果这个不重复可以贪,生气。T3 神秘分讨。T4 分数规划加最大权闭合子图。

下午讲 SA,我放弃了,不做无用功。

T2 CF864F Cities Excursions

这个由于是结点编号,不会重复,所以每个点走的路是固定的。在线做法是直接倍增,不过卡空间,要开成 short。离线不会。

难绷的是 \(j\) 写成了 \(i\),还以为是 vector 太卡常了,改成链式前向星过了,然后给 lhy 吐槽,一眼就看见了截图中的 \(i\) /wul。

8.3 Day 19

模拟赛,但是又是,太困了。。也不会做。。/ll

T1 gym105231D Magic LCM

不会证明的结论:分别把每个数质因子按照个数从大到小排序,对应的一组乘起来再求和就是答案。

T2 HNCPC2023E ytree

式子可以拆开维护,至于 \(d\) 只需要把奇数和偶数深度点分别用两棵线段树维护。具体地两棵线段树维护的都是整棵树,但是一棵只有奇数深度的点答案是对的,另一个同理。

8.4 Day 20

放假,出去吃了油焖鸡,然后就没干啥了,瞎逛,吃一堆冷饮。

8.5 Day 21

模拟赛,困。

T1 简单二分加 dij,赛时太唐了,没想到。。T2 T4 不想做,T3 补了,感觉很对啊,结果一直 TLE。。

T3 集合(set)

建支配树,然后就是把关键点按照 dfs 序排序,然后相邻的两个算一下 LCA,加上后一个点的深度减去 LCA 的深度。当然了,还不知道为啥 TLE,决定重构了。

妈的,原来是倍增数组两维顺序的问题。写 ST 表写多了就下意识认为倍增就应该是小的那一维放前面快,结果这样的树上倍增没有枚举 \(i\),这样反而慢了。。。痛哭/(ㄒoㄒ)/~~

晚上在校园里听歌随机游走,感觉很不错。最近真的好烦,只想一个人待着...

8.6 Day 22

博弈论+分块训练赛???爆写一上午 T3,太唐了。

P2964 [USACO09NOV] A Coin Game S

首先正着选变成倒着放,设 \(f_{i,j}\) 表示考虑到第 \(i\) 个,但是第 \(i\) 个未选,并且这一步即将选 \(j\) 个,记录一下前缀 \(\min\),转移就是:

\[f_{i,j}=s_n-s_{i-1}-f_{i+j,\min(j\times 2,n)} \]

P7443 「EZEC-7」加边

先 dfs 一遍求出必胜必败。显然不能形成环,然后再两次 dfs 记一下每个点除了祖先之外点权最小的必败点。然后算一下每个点改变了对根有无影响,讨论即可。

8.7 Day 23

最近状态不好啊......

T1 星天花雨(rain)

可以发现最终 \(1\) 的个数就是 \(a\) 和 \(b\) 各取一段区间中各自 \(1\) 的数量相乘。然后先枚举一下 \(k\) 的因子,再 \(\mathcal{O}(n)\) 扫一遍用桶和签缀和计算有指定个 \(1\) 的区间个数即可。

T2 野火(wildfire)

如果是树没办法让任何一条边延迟选择。但是基环树的话有一条环边是可以延迟选择的,结论就是先不选最小环边,等消耗完了次小的再选(或者调换)。那么可以二分答案,再根据前面的 check 就行了。具体来说,最小和次小环边总和不能超过 mid,其他边自身不能超过 mid。

下午讲的概率论和 min-max 容斥,但是全是期望,感觉与我无关就摆了。

后面摆了

posted @ 2024-07-20 17:05  LHLeisus  阅读(4)  评论(0)    收藏  举报