ealex.top 中我的 duel
突然想要记一记这个玩意了,嘻嘻。
🔴 2400 CF 1718 C
简单题。发现答案是,\(\gcd(n,d)\times f(d)\),其中 \(f(d)\) 是 \(\max \sum_{i=kd+r,r \ same}a_i\)。首先 \(f(d)\neq 0\) 的 \(\in div(n)\),然后就有了一个 \(\mathcal{O}(qd(n)\log n)\) 的复杂度,过不去!
发现只有 \(\frac{n}{\gcd(n,d)}\in prime\) 的 \(d\) 有用(否则,选择最大的“子”\(f\),这样就可以更大了)。复杂度变成了 \(\mathcal{O}(q\omega(n)\log n)\),是可以过的!
🟡 2300 CF 960 E
鉴定为:2 min 会,30 min 写。
对于每一个点计算答案。求子树中,有多少个奇数/偶数长度的链。如果 \(1\) 为根,\(f_{u,0}=\sum f_{v,1}+1,f_{u,1}=\sum f_{v,0}\)。然后换根。发现这个是对的,但是有点难写(就是,还得一边算一边贡献答案),因此考虑其他做法。
我们讨厌的是啥?就是绕弯(i.e. \(u\rightarrow lca(u,v)\rightarrow v\))。所以设 \(f_{i,0/1}\) 为 \(u\) 子树中的链,现在 \(u\) 是加还是减,的总贡献。其实就是我们变成了对于每一格起始端点计算答案,这样如果起始端点是根,就没有绕弯了,也可以换根 dp,更好写。换根的时候不要忘了减去父亲的贡献!
\(f_{u,0}=a_u+\sum_v f_{v,1}+a_u\times sz_v\),\(g_{v,0}=\sum g_{u,1}+a_v\times (n-sz_v)-(-a_u\times sz_v)\),\(f/g_{*,1}\) 的情况同理。
🟡 2200 CF 1788 E
简单题。\([j,i]\) 可以当且仅当 \(sum_i\ge sum_{j-1}\)。那么我们把前缀和离散化用 bit 即可。一个问题是 \(i-j+1\) 怎么计入答案。那么我们 \(dp_{j}\rightarrow dp_i\) 的时候直接把 \(dp_j-j\) 计入 bit,转移的时候 \(+i\) 即可。
🔴 2600 CF 1945 H
性质+模拟题。首先发现 \(A\) 集合一定是有两个数,证明考虑 \(\gcd\) 多一个数不会增大,\(\And\) 少一个数不会变小。于是就有了一个 trivial 的 \(\mathcal{O}(n^2)\) 算法。
考虑按位与的每一个二进制位。发现如果这一位是 \(0\) 的个数 \(\ge 3\),那么不管怎么选集合,按位与这一位一定是 \(0\)。否则个数 \(\le 2\),设为集合 \(S\)。有两种情况:\(0\) 或者 \(1\)。如果是 \(0\),那么我们 \(A\) 集合的两个数不能完全包含 \(S\),如果是 \(1\),就必须完全包含。发现按位与的结果只和 \(S\) 中是不是在 \(A\) 有关,因此对于所有 \(S\) 中特殊的数,暴力枚举如果他在 \(A\) 集合可不可以满足,这个复杂度是 \(\mathcal{O}(n\log^2 V)\) 的。
否则所有特殊的数都不在 \(A\) 集合中,这个时候按位与的结果就确定了,我们只要最大化 \(\gcd\) 即可。这个调和级数枚举 \(\gcd\) 判断就可以了。
总复杂度 \(\mathcal{O}(n\log^2 V+n \ln V)\)。
🔴 2400 CF 283 D
口胡的。这里 \(x,y\) 是下标。
首先充要条件是 \(x=\frac{y(y-1)}{2}+ky\),\(k\) 是整数。反解 \(k\),解出 \(2k=\frac{2x-y^2+y}{y}\),即 \(\frac{2x}{y}-y+1\) 是偶数,即 \(y\mid 2x\),\(\frac{2x}{y}\) 和 \(y\) 奇偶性不同。
这个奇偶性不同启发我们,把数表示成 \(2^{a(x)}b(x)\),其中 \(b(x)\) 是一个奇数。整理一下我们的条件:\((x,y)\) 是好的当且仅当:
-
\(b(y)\mid b(x)\)。
-
\(a(x)+1\ge a(y)\)。
-
\(a(x)+1-a(y)\) 和 \(a(y)\) 中至少有一个是 \(0\)。
第三个有点难表达,分类讨论一下:
-
如果 \(a(y)=0\),则 \(a(x)+1\ge 0\),可以任取。
-
否则 \(a(x)+1-a(y)=0\),即 \(a(x)=a(y)-1\)。
考虑 dp。遇见「最少操作数」平常有两个着手点:\(dp_{i,j}\) 表示前 \(i\) 个最后一个是 \(j\) 的最小次数,这个显然不可做;\(dp_{i}\) 表示 \(i\) 一定不改变,最小次数,枚举上一个不改变的 \(j\) 即可。这个很好做啊!
现在就是要 \(\mathcal{O}(1)\) 判断 \([j+1,i-1]\) 可不可以任意操作变成 \([j,i]\) 好的。显然有充要条件:
-
\(b(j)\mid b(i)\)。
-
第二个限制,我们发现,一定是 \(i\rightarrow j\) 时 \(a\) 一直减 \(1\),直到 \(0\),然后维持 \(0\),最后可以任意变成一个数。有两种情况:变不成 \(0\),则要满足 \(a(i)-a(j)=i-j\);可以变成 \(0\),那么一定满足条件,变成 \(0\) 的条件是 \(a(i)\le i-j-1\)。
总体来说这题还挺难啊。怎么只有 2400 呢?也许我对数学不敏感啊。
🔴 2500 CF 1712 E2
正难则反,统计 \(\textsf{lcm}(i,j,k)<i+j+k\)。
那么,\(\textsf{lcm}(i,j,k)=k\) 或者 \(\textsf{lcm}(i,j,k)=2k\),后者当且仅当 \(i+j>k\)。
对于 \(\textsf{lcm}(i,j,k)=k\) 的情况:\(i,j\) 都是 \(k\) 的因数。这个可以枚举 \(i\),枚举 \(k\),那么 \(j\) 是在 \(i+1\sim k-1\) 中是 \(k\) 的因数的数量。
对于 \(\textsf{lcm}(i,j,k)=2k\) 的情况:\(i\mid 2k,j\mid 2k,i+j>k\),并且 \(i\nmid k\) 或 \(j\nmid k\)。先统计出 \(i\mid 2k,j\mid 2k,i+j>k\) 的。然后减去 \(i\mid k\) 且 \(j\mid k\) 的。
这个可以扫描 \(l\),时间复杂度是 \(\mathcal{O}(n\log^2 V)\) 的。
🔴 2500 CF 1188 C
首先排序,因为不会影响答案。设 \(dp_{i,j,c}\) 为前 \(i\) 个数,选了 \(j\) 个了,现在的 \(\min\) 是 \(c\) 的方案数。转移,还得枚举上一个选择了啥,不过这个可以前缀和优化。
发现这个东东三维很讨厌啊。那么我们枚举最终的 \(c\),可以设 \(dp_{i,j}\) 为前 \(i\) 个数,选了 \(j\) 个了,保证 \(\min\ge c\)。那么我们最后容斥一下就可以了。
发现内层复杂度 \(\mathcal{O}(nk)\),外层 \(\mathcal{O}(v/k)\),那么时间复杂度就是 \(\mathcal{O}(nv)\) 了,可以通过。
🔴 2600 CF 725 E
首先一定最多加上一个硬币。为什么呢?考虑如果选了两个 \(x,y\),不如一个 \(x+y\) 优,因为 \(x+y\) 一定选择,\(y\le a\le x\) 的 \(a\) 位置一样,执行到这些 \(a\) 之前价格一样。
因此枚举加的价值。现在考虑怎么求出 \(n+1\) 个硬币可不可以。
性质:这些 \(n+1\) 个硬币有些选择,有些不选择,选择的段数是 \(\mathcal{O}(\log n)\) 的。
证明:考虑在可以选的时候尽量选,那么第一次不能选了(设为 \(x\)),那么现在的价格 \(<x\)。但是我们选的第一个 \(\ge x\),那么我们的价格至少减少了一半,归纳即可。
那么我们直接暴力+二分选择/不选择的段就可以做到 \(\mathcal{O}(n\log^2 n)\)。
🔴 2400 CF 51 E
考虑枚举三个点:环上第一个第二个第四个,那么第三个和二,四都有边,第五个和四,一都有边。但是会出现一个三元环伸出一个点的情况。这个我们发现我们对于中心的(度数为 \(3\))的点计算的时候减掉即可。
🔴 2400 CF 1777 F
这道题可以说明我是人机。
看到是除了最大值,其他数的 \(\oplus\),那么直接最大值分治,然后枚举长度小的一边,现在要解决的事情是多次查询 \(l\sim r\) 内的一些数和 \(x\) 的最大 \(\oplus\)。这个可以用可持久化 trie 实现。
好像可以直接正常 l+r>>1 分治哎/ch。
🔴 2500 CF 1307 E
首先同一种颜色的牛最多会满足两只。我们可以很简单的求出,一头牛从右边/左边走到达的地方。
这个题要求出一个不算重的方法啊,否则去重太麻烦了。那么我们发现被吃掉的草是一定是先被左边的牛吃,一个分界点后被右边的牛吃。可以枚举这个分界点。然后就不会算重了。
枚举了分界点(第一个左边的牛),首先保证答案最大。发现我们决定了左右以后,我么按照离分界点距离排序了以后一定是可行的,因为有“都不完全相同”这个条件。特别的,不同喜好的牛可以分开考虑。那么,求出左右两边都可以的,只能左边的,只能右边的。计算答案是 trivial 的。
特殊的,有可能一个左边的也没有。
🔴 2400 CF 639 D
简单题。
首先 \(1,5\) 这个显然是着手点。如果 \(b>5c\) 则令 \(b=5c\),否则一次性选 \(5\) 个就没有意义了。现在 \(u\rightarrow v\) 的代价是 \(b\times [(v-u)/5]+c\times ((v-u)\bmod 5)\)。但是发现 \(v\gets v+1\) 的之后这个 \(\bmod\) 也会动,很讨厌。因此按照 \(v\) 的 \(\pmod 5\) 分类,这样只有前面的会动。
那么现在哪些 \(x\)(题面中的)是有意义的呢?显然只有 \(t_i+[0,5)\) 是有意义的。现在已经可以写程序了。
但是很难写啊。从大到小枚举这些数,还有一个性质:我们因为要给 \(b\times [...]\) 中的数加一,我们其实可以前面减去再加回去(就是移项),这样就更好写了。用一个 set 维护前 \(k\) 小,每次只会加入一个数。
🔴 2400 CF 847 J
考虑这个限制有点难刻画,那么我们就上网络流。因为是恰好一个人给另一个人,说明流的大小一定是 \(m\)。二分一下,设答案是 \(k\),建图(上标是流量):
-
\(i\stackrel{k}{\longrightarrow} T\)。
-
\(i+n\stackrel{1}{\longrightarrow} u_i,v_i\)。\(i\in [1,m]\)。
-
\(S\stackrel{1}{\longrightarrow} i+n\)。\(i\in [1,m]\)。
🔴 2600 CF 1090 J
如果是直接计算答案,满足的条件比较难以刻画。
表示一个字符串是 \(s\) 尽量短前缀和 \(t\) 的一个前缀拼接起来。那么,我们容斥一下,用 \(n\times m\) 减去重复的个数。
考虑什么时候会重复。

其中 \(A'\) 是 \(A\) 的前缀。那么我们发现 \(A'\) 必然是 \(t\) 的一个 border。事实上,重复次数就是 \(t_{i-border(i)}\)(一个集合),在 \(s\) 中出现次数之和。
\(t_i\) 的 \(border(i)\) 有 \(\pi(i),\pi(\pi(i)),\cdots\),那么我们建出 fail 树,变成子树和即可。
🔴 2600 CF 1704 F
如果有 RB 或者 BR,那么优先选择。
否则一定是 WWWRRRWWWBBBWWWRRRWWWRRR 这种连续段的,这个呢我们发现不同连续段不会互相影响。这个和数量有关,如果 \(a+first_a\ge b+first_b\) 就是 \(a\) 赢,\(first_x\) 是 \(x\) 是否是先手。
考虑第一种情况:一开始的 R,B 数量不同。那么我们就是哪一方多,赢定了。
否则开始 R 和 B 数量一样,现在每个人都想要成为后手。那么就是一些连续段,RBRBRBRBRB 这种交替的。然后发现我们不用考虑 R 个数和 B 个数不同的链,R 和 B 反过来一样,那么就只有 RB\(\times count\) 这种了!那么 \(sg_n=\operatorname{mex}\{sg_{i-1}\oplus sg_{n-i-1}\}\)。
然后这个有 \(\mathcal{O}(n^2)\),出题人真的可以不放这种优美的东西过去吗?那么开始找规律,前 \(200\) 个:
0 1 1 2 0 3 1 1 0 3 3 2 2 4 0 5 2 2 3 3 0 1 1 3 0 2 1 1 0 4 5 2 7 4
0 1 1 2 0 3 1 1 0 3 3 2 2 4 4 5 5 2 3 3 0 1 1 3 0 2 1 1 0 4 5 3 7 4 8
1 1 2 0 3 1 1 0 3 3 2 2 4 4 5 5 9 3 3 0 1 1 3 0 2 1 1 0 4 5 3 7 4 8
1 1 2 0 3 1 1 0 3 3 2 2 4 4 5 5 9 3 3 0 1 1 3 0 2 1 1 0 4 5 3 7 4 8
1 1 2 0 3 1 1 0 3 3 2 2 4 4 5 5 9 3 3 0 1 1 3 0 2 1 1 0 4 5 3 7 4 8
1 1 2 0 3 1 1 0 3 3 2 2 4 4 5 5 9 3 3 0 1 1 3 0 2 1 1 0
然后发现到一个点以后就是一个 \(34\) 的循环节。那么就做完了。
🔴 2500 CF 1327 F
小清新简单题?
拆位,然后设 \(dp_{i,j}\) 为到了 \(i\) 了,上一个 \(0\) 是 \(j\) 这个位置。显然 \(i\) 可不可以放 \(0\) 是容易决定的。其中 \(dp_{i+1,i}=\sum_{j} dp_{i,j}\) 或者 \(0\)(有没有要求是 \(1\))。\(dp_{i+1,j}=dp_{i,j}\),其中 \(j\) 是有范围的,不难发现是单调递增的区间。
复杂度 \(\mathcal{O}(nk)\)
🔴 2400 CF 593 F
小清新简单题?
发现 \(w\) 是单调不增的,因此可以直接并查集维护祖先中第一次出现非 \(1\) 的边权的位置。然后显然最多 \(\log\) 次。
值得一提的是,可以不写倍增 lca,直接用类似树剖的方法写,代码超级短。
🔴 2700 CF 1366 G
设 \(dp_{i,j}\) 为 \(s\) 中前 \(i\) 个和 \(t\) 中前 \(j\) 个匹配的最小花费。
那么显然有转移:
-
\(dp_{i,j}+1\rightarrow dp_{i+1,j}\)。
-
\(dp_{i,j}\rightarrow dp_{i+1,j+1}\)(\(s_{i+1}=t_{j+1}\))。
-
\(dp_{i,j}\rightarrow dp_{i+1,j-1}\)(\(s_{i+1}=.\))。
但是发现还有一种情况就是 \(s=aab..\),\(t=a\),我们其实答案是 \(0\)。发现这种就是「我前面加的后面一定会剪掉,不用管」。因此我们预处理 \(nxt_i\) 表示第一次 \(j\) 满足 \(s_{i\sim j}\) 操作下来是空。
那么有转移 \(dp_{i,j}\rightarrow dp_{nxt_{i+1}}{j}\)。
🟡 2200 CF 868 D
斟酒重点是字符串太长了考虑怎么维护吧。发现首尾 \(10\) 个不够,我也不知道为啥。比较重要的是,必须首+特殊字符+尾,否则会有问题。
浙公网安备 33010602011771号