Loading

AtCoder 杂题选座

AtCoder 杂题选做

整理一下,分类不严谨

DP & 组合数学

ARC217C Greedy Customers 2

好久没自己想出来一道题了。

# define 钦定 按住

给定 \(N\) 个商品及其价格 \(A_i\),现在有 \(N\) 个人依次来商店购物,每个人手里有 \(C\) 日元,购买方式如下:

  • 随机均匀在 \([1,C]\) 中抽取一个整数 \(x\) 作为预算,并购买剩余商品价格 \(\le x\) 的中的最贵的一个,若没有,则直接离开。

对于每个 \(k=0,1,\cdots,N\),求恰好卖出 \(k\) 件商品的概率,对 \(998244353\) 取模。

\(1\le N\le 100\)

考虑一个十分 naive 的状压 dp,即我加一个二进制状态,来记录剩下的商品集合,直接转移即可。时间复杂度 \(O(n2^n)\)

考虑能否减少记录无用状态,或者合并状态。你会发现从这个方向看并不好下手,因为这种 dp 与时间有关,怎么搞都有后效性。

观察,你会发现如果每个人确定了它们抽的数,由于他们都是按贪心的策略,那么无论他们按什么顺序买,最后剩下的商品集合一定都是一样的,即结果和时间压根没关系。这是一步关键观察,即我们可以按其它顺序 dp。

因此我们钦定他们按预算从小到大来买,考虑预算在区间 \([A_i,A_{i+1})\) 的所有人,那么如果前面有剩下的商品,我们一定就会尽可能多的给这些人分配了。

因此容易定义 dp 状态,设现在枚举到第 \(i\) 个区间,前面所有区间(包括当前区间)有 \(j\) 个人,且前面所有区间(包括当前区间)还剩 \(k\) 个商品没买的方案数为 \(dp_{i,j,k}\)

先提前算好所有区间的长度 \(len_i\),以及包含了几个商品 \(tmp_i\)。多枚举一层 \(p\),表示当前区间有多少个人。那么假如说我当前区间的商品就足以供给这几个人了,我不仅可以不用以前的商品,还可以多存点给后面用,即 \(dp_{i-1,j-p,k}\) 转移到 \(dp_{i,j,k+tmp_i-p}\)

假如说不够的话,我就得动用以前的了,如果以前的商品够,那我还是从 \(dp_{i-1,j-p,k}\) 转移到 \(dp_{i,j,k+tmp_i-p}\);如果不够,那就没办法了,从 \(dp_{i-1,j-p,k}\) 转移到 \(dp_{i,j,0}\)。最后 \(dp_{cnt,n,n-k}\) 就是对应 \(k\) 的答案,其中 \(cnt\) 是区间个数。

然后再考虑转移系数要乘多少。首先总得确定,当前区间是哪几个人,方案数是 \(\binom{n-j+p}{p}\),然后要给他们每个人分配一个位置,因此转移系数为 \(\binom{n-j+p}{p}\cdot len_i^p\)

ARC074E RGB Sequence

有一个长 \(N\) 的序列 \(A\),要给序列中的每个元素一种颜色 \(\{1,2,3 \}\)

\(M\) 条限制 \((l,r,x)\),表示 \(l\)\(r\) 的格子颜色种数恰好为 \(x\),问方案数,对 \(10^9+7\) 取模。

\(1\le N,M\le 300\)

考虑容斥,发现没有任何意义,因为不好求的转化出来还是不好求,于是考虑 dp。

思考一种可行性 dp,若处理到 \(i\) 位置,我们可以记录前面 \(i-1\) 个位置的填涂方案,再根据限制看能不能填就行了,是 \(O(n3^n)\) 的。

考虑合并状态,思考我们根据限制看能不能填的时候,最少能用哪些信息。

发现我们判断一个区间的颜色种数,实际上可以去找最右边的一个与 \(i\) 颜色不同的位置 \(j\),如果 \(j\) 在这个区间里面,那就至少有两种颜色。同理我们可以找到第三种不同的位置 \(k\)

因此我们设计 dp 状态为 \(dp_{i,j,k}\)\(i\) 表示考虑到第 \(i\) 位,最右边的与 \(i\) 颜色不同的位置为 \(j\),最右边的与 \(i\)\(j\) 颜色都不同的位置为 \(k\)。若不存在 \(j\)\(k\) 这种位置,就记作 \(0\)。考虑转移。

  • 当下一位填的数与 \(i\) 位置的颜色相同,则 \(dp_{i+1,j,k}\larr dp_{i,j,k}\)
  • 当下一位填的数与 \(j\) 位置的颜色相同,则 \(dp_{i+1,i,k}\larr dp_{i,j,k}\)
  • 当下一位填的数与 \(k\) 位置的颜色相同,则 \(dp_{i+1,i,j}\larr dp_{i,j,k}\)

将限制区间右端点排序,每次 check 一下枚举的 \(i,j,k\) 合不合法即可,时间复杂度 \(O(n^3)\)

ARC059C Children and Candies

现有 \(N\) 个编号为 \(1\)\(N\) 的小朋友,有 \(C\) 颗糖果。若第 \(i\) 个小朋友拿到了 \(a\) 颗糖果,则幸福值为 \(x_i^a\),所有小朋友的活跃度定义为他们幸福值的乘积。

定义 \(f(x_1,x_2,\dots,x_N)\) 为对于所有可能的分糖方式,活跃度之和,给定序列 \(A\) 和序列 \(B\),求

\[\sum_{x_1=A_1}^{B_1}\sum_{x_2=A_2}^{B_2}\cdots\sum_{x_N=A_N}^{B_N}f(x_1,x_2,\dots,x_N) \]

\(10^9+7\) 取模。

\(1\le N,C\le 400,1\le A_i\le B_i\le 400\)

先考虑怎么求 \(f(x_1,x_2,\dots,x_N)\),即 \(\forall i,A_i=B_i\)

不好推式子,因此对着实际意义 dp。合并一下状态,定义 \(dp_{i,j}\) 表示 \(1\sim i\) 个小朋友一共发了 \(j\) 颗糖的 \(f\) 值,则可以直接卷积。

\[dp_{i,j}=\sum_{k=0}^j dp_{i-1,k}x_i^{j-k} \]

\(O(n^3)\) 的。

然后考虑暴力的枚举第 \(i\) 个小朋友的 \(x_i\),同样的方法,设 \(f_{i,j}\) 表示第 \(1\) 个到第 \(i\) 个小朋友,发 \(j\) 颗糖的答案。

\[f_{i,j}=\sum_{x_i=A_i}^{B_i}\sum_{k=0}^jx^k_i\cdot f_{i-1,j-k} \]

\(O(n^4)\),过不了。

你发现可以维护形如 \(sum_k=\sum_{x}x^k\) 的一个前缀和,这样就 \(O(n^3)\) 了。

ARC108E Random IS

给定一个 \(n\) 个数的排列,称这个排列的一个子序列是好的,当且仅当它的值递增。

现在将重复以下操作来构造子序列:

  • \(k\) 表示有多少个位置满足加入子序列后,子序列仍是好的。
  • \(k=0\),结束;否则随机均匀选择一个位置,回到上一个操作。

求期望子序列长度。

\(1\le N\le 2000\)

可以状压,这样子是 \(O(2^n)\) 的。

思考怎么合并状态,寻找一下有无什么好的性质。

你会发现一个位置能不能选,只取决于其左边第一个选的位置和右边第一个选的位置(性质 A)。

因此可以计算 \(w_{i,j}\),表示若 \(i\)\(j\) 选了,\([i+1,j-1]\) 内还有多少个数可以选。这个很好求,用树状数组维护 \(O(n^2\log n)\) 即可。

基于性质 A,这启示我们只要确定了左右第一个选的位置,无论是从全局考虑还是从局部考虑,它的概率是一样的。因此每个区间内都是一个独立的子问题,我们就不用对着时间轴来进行全局决策了,独立进行局部决策,合并即可。

考虑用区间 dp。设 \(f_{i,j}\) 表示在已经选定了 \(i,j\) 两个位置的情况下,期望的选择个数(不算 \(i,j\)),则有转移:

\[f_{l,r}=1+\frac{1}{w_{l,r}} \sum_{l<k<r,a_l\le a_k\le a_r} f_{l,k}+f_{k,r} \]

后者实质上是在对着值域 dp,因此也用树状数组维护即可,总时间复杂度 \(O(n^2\log n)\)

ARC115E LEQ and NEQ

给定一格长度为 \(N\) 的整数序列 \(A_1,A_2,\dots,A_N\),计算满足以下条件的长度为 \(N\) 的整数序列 \(X_1,X_2,\dots,X_N\) 的个数,对 \(998244353\) 取模。

  • \(1\le X_i\le A_i\)
  • \(X_i\ne X_{i+1}\)

\(2\le N\le 5\times 10^5\)

题目感觉很容斥啊!其相当于给出了 \(N-1\) 个限制 \(P_1,P_2,\dots,P_{N-1}\)。于是考虑它们的反面也就是 \(\overline{P_i}\),形如 \(X_i=X_{i+1}\)

考虑计算钦定 \(k\) 个限制 \(\overline{P_i}\) 的方案,记其为 \(f_k\),可得到最后答案为

\[\sum_{i=0}^{n-1}(-1)^if_i \]

现在考虑计算它。


思考一下,一个序列中有 \(k\) 处地点满足 \(X_i=X_{i+1}\),我们把这样的点给合并到最前面来,那么最后序列里就会剩下 \(n-k\) 个元素。也就是说等价于这个长 \(N\) 的序列被划分成了 \(n-k\) 个相等段,我们对这个计数就行了。

\(dp_{i,j}\) 表示现在考虑到第 \(i\) 位,划分了 \(j\) 段的方案数,最后答案为

\[\sum_{i=0}^{n-1}(-1)^idp_{n,n-i} \]

则有朴素转移式

\[dp_{i,j}=\sum_{k=0}^{i-1}dp_{k,j-1}\times\min_{[k+1,i]} \]

2D-1D,时间复杂度 \(O(n^3)\),而且由于是 2D,所以说得在状态上下手。

这里有一个巧妙转化,根据我们的答案式子,我们最后只关心划分出的段数的奇偶,于是有

\[dp_{i,p}=\sum_{k=0}^{i-1}dp_{k,p\operatorname{xor}1}\times\min_{[k+1,i]} \]

相当于我们合并了状态,变成 \(O(n^2)\) 了。

1D-1D 了,很有希望啊,看能不能用啥东西来维护啥的。

注意到就因为你这个 \(\min\)\(i\) 有关所以不好优化,然后能自然的想到,我们找到 \(i\) 左边第一个小于 \(a_i\)\(a_{pos}\),然后对于 \([pos+1,i]\) 的部分乘上 \(a_i\) 就可以了。那么对于前面的部分,你发现这个以前你肯定算过啊,就是 \(dp_{pos,p}\),这下牛逼了。

维护一个前缀和与单调栈即可,时间复杂度 \(O(n)\)

AT_m_solution2019_c Best-of-(2n-1)

A 和 B 玩若干局游戏,每一局,A 胜率为 \(a\),B 胜率为 \(b\),平局概率为 \(1-a-b\)。给定 \(n\),率先累计赢下 \(n\) 局游戏的人获胜,问游戏的期望局数,对 \(10^9+7\) 取模。

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

考虑 \(a+b=1\),即没有平局的情况。

则我们考虑求游戏进行 \(n+i\) 局的概率,其中 \(0\le i<n\)。这意味着,\(n+i\) 局中有 \(n\) 局是赢者胜,且最后一局是赢者胜,如果是 A 赢,则概率为

\[\binom{n+i-1}{n-1}\times a^n b^i \]

因此期望为

\[\sum_{i=0}^{n-1}\binom{n+i-1}{n-1}\times (a^nb^i+a^ib^n)\times(n+i) \]

考虑 \(a+b<1\),即有平局的情况。

出现平局即会增加许多无谓的局数,发现它大概是一个收敛级数。设 \(k\) 表示期望 \(k\) 轮就会出现一次决定了胜负的局数,则

\[k=\sum_{i=0}^{\infty}(i+1)P(k=i) =\sum_{i=0}^{\infty}P(k\ge i) =\sum_{i=0}^{\infty}c^i=\frac{1}{1-c} \]

\(a'=\frac{a}{a+b},b'=\frac{b}{a+b}\),此时答案就变成了:

\[\sum_{i=0}^{n-1}\binom{n-i+1}{n-1}\times(a'^nb'^i+a'^ib'^n)\times(n+i)\times\frac1{1-c} \]

ABC253Ex We Love Forest

给定 \(n\) 个点无边的图和 \(m\) 条待选的无向边。每次等概率从 \(m\) 条边中抽取一条边加入图中,对于 \(i=1,2,\dots,n-1\),依次询问抽取 \(i\) 条边后原图形成一个无环图(即森林)的概率是多少,对 \(998244353\) 取模。

\(1\le n\le 14,1\le m\le 500\)

首先概率转计数。

由于 \(n\) 很小,想到枚举点集 \(S\),然后求其 \(dp_{S,i}\),即点集 \(S\)\(i\) 条边形成森林的方案数。

那么我们肯定得先对点集 \(S\) 的导出子图的生成树计数,设其为 \(f(S)\),可以用 Matrix-Tree 定理,但是我不会。

考虑枚举 \(S\) 的子集,然后合并 \(T\)\(S-T\)

\[f(S)=\frac 1 2\sum_{T\sub S,T\ne\varnothing}f(T)f(S-T)E(T,S-T)\binom{|S|-2}{|T|-1} \]

因为 \(T\)\(S-T\) 是对称的,会被算两遍,所以要除以 \(2\),这里 \(E(S,S-T)\) 表示两个点集间的边数,由于要考虑顺序,所以用插板法乘个 \(\dbinom {|S|-2}{|T|-1}\)

剩下的就是计算 \(dp_{S,i}\),考虑枚举最后一棵树的子集,于是有。

\[dp_{S,i}=\sum_{T\sube S,T\ne\varnothing} dp_{S-T,i-|T|+1}\cdot f(T)\cdot\binom{i}{|T|-1} \]

发现这样会算重啊!因此考虑每次都使 \(S\) 中编号最小的结点在新加入的 \(T\) 中就无虞了,即。

\[dp_{S,i}=\sum_{\min(S)\in T,T\sube S} dp_{S-T,i-|T|+1}\cdot f(T)\cdot\binom i {|T|-1} \]

ARC058E 和風いろはちゃん

给定三个正整数 \(X,Y,Z\),称一个长 \(N\) 的序列是俳句的,当且仅当:

  • 序列所有元素都是 \(1\)\(10\) 的正整数;
  • 存在 \(1\le x<y<z<w\le N\),使得:
    • \(\sum_{i=x}^{y-1}a_i=X\)
    • \(\sum_{i=y}^{z-1}a_i=Y\)
    • \(\sum_{i=z}^{w-1}a_i=Z\)

给定 \(N\),求有多少个长 \(N\) 的俳句的序列,对 \(10^9+7\) 取模。

\(3\le N\le 40,1\le X\le 5,1\le Y\le 7,1\le Z\le 5\)

最状压。

通过 \(X+Y+Z\le 17\),我们可以知道其实是可以通过状压的形式来刻画合不合法的。

例如 \(3,2,4\),我们可以状压成 100101000,这样判断合不合法时,只需要判断 \(Z,Y+Z,X+Y+Z\) 这些位上有无 \(1\) 即可。

然后考虑计数,你发现这个要算重,因此考虑从反面看,对完全不俳句的序列计数。

\(dp_{i,S}\),表示考虑到第 \(i\) 位,然后最后一小段后缀和对应的 \(17\) 位状压 \(S\),你发现这段后缀只需要保留和小于等于 \(17\) 的部分就行了。

然后用刷表法,枚举第 \(i\) 位用哪个数字,然后判断新状态是否合法,若不合法,则有贡献。

一共有 \(N\) 个人,在 \(K\) 天中的第 \(i\) 天,随机在 \(N\) 个人中抽取 \(a_i\) 个互不相同的人发一块饼干。\(c_i\) 为第 \(i\) 个人最后得到的糖果总数,求 \(\prod c_i\) 乘上 \(\prod\binom N{a_i}\) 的期望值,对 \(10^9+7\) 取模。

\(1\le N\le 1000\)\(1\le K\le 20\)

首先它都乘上 \(\prod\binom N{a_i}\) 了,所以就不是期望。应该是所有抽取方案中,乘积的总和。

有一招高妙的,我们思考 \(c_1\times c_2\times c_3\times\cdots\times c_N\)组合意义。那就应该是,对于每个人,我们让它在不同天拿到的饼干中选一个,得到的方案数。即在拿到饼干的日子里选一天。

这样我们设 \(dp_{i,j}\) 表示,在第 \(i\) 天之前,有 \(j\) 个人已选出自己饼干的方案数。

\[dp_{i,j}=\sum_{k=0}^{j}dp_{i-1,k}\cdot\binom{n-k}{j}\binom{n-j}{a_i-j} \]

时间复杂度 \(O(n^2k)\)

ARC116E Spread of Information

给定一棵大小为 \(N\) 的树和一个整数 \(K\)

定义某个点离关键点的距离,为这个点到任一关键点距离的最小值。 最小化离关键点最远结点的距离。

\(1\le K<N\le 2\times 10^5\)

容易想到二分答案,这样转化成了一个,树上 \(x\) 半径最小覆盖问题。怎么做呢?

首先有一种贪心的想法。就是假如说 \(u\) 子树中有一个点 \(p\),还没被覆盖到,我们就把这个点的问题踢皮球,踢到这个点的 \(x\) 级祖先去,相当于一个 ddl。然后如果在 \(u\)\(p\)\(x\) 级祖先中顺便就把这个点覆盖了,那挺好;否则就要选 \(x\) 级祖先。

贪心证明找个时间补。

有了这个就好做了。从下往上 dp,维护这个子树中最远没有被覆盖到的点的距离 \(f_u\),以及离这个点最近的标记点的距离 \(g_u\)。分讨。

  • \(f_u+g_u\le x\),说明这个子树内连最远的点也能覆盖到了,那么 \(f_u\) 值设为极小值。

  • 否则:

    • \(f_u=x\):说明 \(u\) 是这个未被覆盖的点的 \(x\) 级祖先,那么这时候就只能标记 \(u\) 点了。此时 \(f_u\) 为极小值,\(g_u\larr 0\)
    • 否则说明有覆盖不到的点,只是事态不紧急。但如果 \(u\) 没覆盖到,即 \(g_u>x\),那么就得 \(f_u\larr \max(f_u,0)\) 了。

    ARC124E Pass to Next

\(N\) 个人围成一圈,编号为 \(1,2,\dots,N\),最初第 \(i\) 个人持有 \(a_i\) 个球。

接着它们将执行以下操作:每个人选中自己拥有的若干球(可以不选),然后同时将选中的球向下一个人传递,最后生成一个表示第 \(i\) 个人当前持有多少球的新序列。求所有可能序列元素积之和。对 \(998244353\) 取模。

\(3\le N\le 10^5\)\(0\le a_i\le 10^9\)

我们考虑研究操作序列,这里的操作序列表示的是第 \(i\) 个人向后传递多少球,这个要好研究一点。

然后可以发现:当操作序列整体加一或减一时,得到的最终序列不变。这意味着,至少有一个人没传的操作序列与最终序列形成了双射。

我们会在 dp 过程中将大家都传了的方案进行容斥,这会先不管。

这里因为是序列之积,这很容易让人想到从组合意义的角度去刻画它:在这里它的组合意义,就是在传递操作过后,每个人从自己拥有的球中选择一个的方案数。

由于球数,即值域过大,放在状态里是不可行的。因此考虑每个球的来源,要不然,一个人选择的是自己本来就有的球;要不然,一个人选择的就是别人传过来的球。

你发现通过这样的划分,前者可选的数量,只和下一个人有关。而后者剩余的数量,则只与上一个人有关。两者之间是互不相关的,因此可以分别 dp。

\(dp_{i,0/1}\),表示:

  • \(dp_{i,0}\):第 \(i\) 个人选择自己原有的球,前 \(i-1\) 个人选球的方案。(用这种设计的原因是,选择自己的原有的球是和下一个人有关的,因此我们对于 \(i\) 的贡献,放到 \(i+1\) 去考虑)
  • \(dp_{i,1}\):第 \(i\) 个人选择前一个人传过来的球,前 \(i\) 个人选球的方案。

转移方程为:

\[\begin{align} dp_{i+1,0}&=dp_{i,1}+\sum_{j=1}^{a_i}dp_{i,0}\times j+dp_{i,1} \\&=dp_{i,0}\sum_{j\le a_i}j+dp_{i,1}(a_i+1) \end{align} \]

表示我们枚举第 \(i\) 个人留了多少球,假设是 \(j\)。则当 \(j\ge 1\) 时,会有 \(dp_{i,0}\times j+dp_{i,1}\);然后 \(j=0\) 时就只会选传来的球。

同理有:

\[\begin{align} dp_{i+1,1}&=dp_{i,1}\times a_i+\sum_{j=1}^{a_i}dp_{i,1}\times(a_i-j)+dp_{i,0}\times j(a_i-j)\\ &=dp_{i,0}(a_i\sum_{j\le a_i}j-\sum_{j\le a_i}j^2 ) +dp_{i,1}\sum_{j\le a_i}j \end{align} \]

然后考虑容斥,你发现只要把第一个转移式子中,\(j=a_i\) 的情况排除掉就得到了所有人必须传球的方案数,然后用总的减去这个就行了。

最后处理这个环。我们依次计算第 \(1\) 个人是选的自己的,还是选的 \(n\) 号点的,然后加起来就可以了。

ARC096C Everything on It

有一个面馆,有 \(N\) 种配料可加,即有 \(2^N\) 种面可以点。

一个人来点若干碗面,满足以下要求:

  • 不能点配料完全一致的拉面;
  • 每种配料至少出现在两碗面中间。

给定 \(N\),求点面方案数,对一个质数 \(M\) 取模。

\(2\le N\le 3000\)

第二个限制太诡异,考虑设钦定 \(k\) 个调料出现次数 \(\le 1\) 的方案数为 \(f(k)\),则答案为

\[\sum_{i=0}^n(-1)^i\binom n i f(i). \]

考虑计算 \(f(k)\)

对于钦定的这 \(k\) 个调料,它们的出现次数最多一次。枚举 \(i\),表示将它们划分成几个集合,如果出现次数都为 \(1\) 次的话,那就是 \(\begin{Bmatrix}k\\i\end{Bmatrix}\)。但是由于是最多一次,那么有些元素可以不出现,我们单独划出一个不出现元素的集合即可,在这个集合里提前放一个元素防止为空。根据这个集合意义,得到 \(\begin{Bmatrix}k+1\\i+1\end{Bmatrix}\)

考虑计算剩余调料,首先仅由它们组成的还有 \(2^{N-k}\) 种拉面,然后我们会选其中一些拉面,方案数为 \(2^{2^{N-k}}\)。然后我们还可以选这些调料被包含在这 \(i\) 个集合中的部分,这 \(i\) 个集合中,每个集合都有 \(2^{N-k}\) 的贡献,所以再乘上一个 \(2^{i\times (N-k)}\)

答案为

\[\sum_{k=0}^n(-1)^k\binom n k2^{2^{N-k}}\sum_{i=0}^k\begin{Bmatrix}k+1\\i+1\end{Bmatrix}2^{i\times (N-k)}. \]

\(O(n^2)\) 预处理组合数及第二类斯特林数即可。

贪心

AT nk19q E Weights on Vertices and Edges

有一张 \(n\) 个点 \(m\) 条边的连通无向图,点有点权,边有边权。现在要删除若干条边(可以不删),使得剩下的图满足对于,没有被移除的边,其所在连通块中的点的点权和大于等于该边的边权。

\(1\le N,m\le 10^5\)

相当于最多能保留多少。

归纳法的思想,考虑假如边 \(e\) 可以保留,有哪些边可以保留。那么你会发现,在边权小于等于 \(w_e\) 的子图中,边 \(e\) 所在的连通块是全都可以保留的。相当于我们进行了一个按照边权从大到小的归纳。

然后考虑找到一些显然可以保留的边,作为归纳的基础(或者说是边界)。也即,在边权小于等于 \(w_e\) 的子图中,边 \(e\) 所在连通块点权大小和比它大,那就是肯定可以选的。

那如何证明,偏偏选了这一类边作为基础,就一定可以通过归纳覆盖到所有可以保留的边呢?考虑最后答案对应的图,对于每个连通块我们找到它边权最大的边,你会发现其一定满足:

  • 所在连通块其它边边权比它小;
  • 连通块点权和大于等于这条边。

对于实现,先按边权从小到大排序,然后依次加入,用并查集维护。假如说碰到了满足上述条件的边,那么我们就把这条边,以及其所在连通块中还未被计入答案的边,都计入答案。时间复杂度 \(O(m\log m)\)

ds

ARC082D Sandglass

现在有一个沙漏,每秒漏 \(1\) 单位沙子,一共有 \(X\) 单位沙子,且 \(A\) 部分最初有 \(a\) 单位沙子,在上半部分。

给定序列 \(r\)\(r_i\) 表示在第 \(i\) 秒时,沙漏会被翻转一次。

\(Q\) 次询问,每次询问 \(t_i,a_i\),表示当 \(a=a_i\) 时,第 \(t_i\)\(A\) 部分的沙子数。

\(10^5\)

首先考虑把操作和查询放一起,按照时间来扫一遍,并同时维护每个 \(a_i\) 的答案。如果暴力维护的话,就是大家该加加,该减减,如果 \(<0\) 或者 \(>X\) 判断一下就行了。

我们将 \(m\) 个询问的 \(a_i\) 排序,那么如果现在是减,那么你会发现它一定是一段前缀被覆盖为 \(0\),其余正常减就行了,加法同理。

博弈论

AGC064C Erase and Divide Game

高桥和青木玩游戏,现在黑板上有一些数,由 \(N\) 个不交的区间表示。

高桥先手,两人轮流操作,删掉这些数里面的奇数/偶数,再对每个剩下的数施以 \(x\leftarrow\left\lfloor\dfrac x2\right\rfloor\),无法操作的人输。

假设两人都按照最优策略,问谁赢。

\(N\le 10^4,0\le V\le 10^{18}\)

假如说黑板上只是单个的数,怎么做?

考虑从低位到高位建一棵 01-Trie,每次相当于往下走一格,谁走出去谁赢。这样直接从底往上按题意合并胜负状态,就行了。

区间就有点棘手了,因此我们只能考虑一种整体合并的方法。

称根节点在第 \(0\) 层,若在第 \(k\) 层,能合并的结点对应的数一定为 \(x\)\(x+2^{k-1}\)(可以画图)。因此我们将整个 \([0,2^k)\) 拆成两半,然后两边区间用双指针做归并即可。

具体来说,我们首先把当前手上的所有区间拿出来,把包含于 \([0,mid]\) 的放一堆,包含于 \((mid,2^k)\) 放一堆,如果跨过 \(mid\) 拆成两半放即可,然后一步步归并,得到新的一些区间,进入下一轮循环。

有个重点,对于空点要单独设状态,按理来说空点与空点合并还是空点,而空点与其它任何点合并都可以变成必胜点,因为可以直接走出去了。

Ad-hoc

ARC137D Prefix XORs

给定一个长 \(N\) 的序列 \(A\),以及一个整数 \(M\),对于每个 \(k=1,2,\dots,M\),求 \(A\)\(k\) 阶前缀异或和。

\(1\le N,M\le 10^6,0\le A_i<2^{30}\)

找规律。

注意到我找规律找了半天,发现找的是后缀和的规律,所以最后做的时候把数组倒过来了。

考虑对每阶后缀和,我们去看一下有哪些数贡献了答案。按理来说,这个数前面有多少个 \(1\),就说明它被贡献了几次,然后列出一张 \(n=8,m=8\) 的表。

![](D:\XZY_SF\文章\pic\屏幕截图 2026-04-03 211517.png)

然后启用观察力,你发现这个是个完美的分形结构。

![](D:\XZY_SF\文章\pic\屏幕截图 2026-04-03 211854.png)

考虑它的第一层分形,三个为 \(1\) 的坐标分别为 \((0,0),(0,1),(1,0)\),为 \(0\) 的坐标为 \((1,1)\)

考虑它的第二层分形,如果一个坐标要为 \(1\),那么在二进制表示下,它的二进制最低位不能为 \((1,1)\),这是为了满足第一层分形结构;而它的二进制第二位不能为 \((1,1)\),这是为了满足第二层分形结构。

因此,令 \(k=\log_2n\)。则对于这 \(k\) 位中的每一位,都满足它的横纵坐标不同时为 \(1\),换句话说 \(x \operatorname{and} y=0\)

也就是说,在第 \(x\) 排,能产生的贡献的,就是 \(\operatorname{not} x\) 的所有子集,因此做一个高维前缀和即可。

posted @ 2026-04-28 14:46  xzy_sf  阅读(33)  评论(0)    收藏  举报