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\) 是否是先手。

考虑第一种情况:一开始的 RB 数量不同。那么我们就是哪一方多,赢定了。

否则开始 RB 数量一样,现在每个人都想要成为后手。那么就是一些连续段,RBRBRBRBRB 这种交替的。然后发现我们不用考虑 R 个数和 B 个数不同的链,RB 反过来一样,那么就只有 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\) 个不够,我也不知道为啥。比较重要的是,必须首+特殊字符+尾,否则会有问题。

posted @ 2024-11-08 14:58  SFlyer  阅读(93)  评论(1)    收藏  举报