Deltix Round, Spring 2021 (open for everyone, rated, Div. 1 + Div. 2) 题解

A

直接按照题意模拟,如果某一步不再有格子的状态变化就 break。

B

首先题目不弱于直接将两个数 \(x,y\) 变为 \(-x,-y\),而稍微想一下即可发现 \(x,y\) 变为 \(-x,-y\) 只需进行以下三次操作:

  • 1 x y\(x+y,y\)
  • 2 x y\(x+y,-x\)
  • 1 x y\(y,-x\)
  • 2 x y\(y,-x-y\)
  • 1 x y\(-x,-x-y\)
  • 2 x y\(-x,-y\)

由于 \(n\) 是偶数,此题直接做完了。操作次数 \(3n\)

C

直接维护一个栈存储当前所有操作的优先级,每次加入一个数 \(x\)\(x=1\) 就直接压入栈顶,否则不断弹出栈顶直到栈顶元素等于 \(x-1\) 为止。时间复杂度 \(n^2\)

D

vp 的时候差点不会做这道题,wssb 我紫菜 /dk

在下文中,为了方便描述,记 \(A_i\) 表示第 \(i\) 个人喜欢的货币的集合。

首先这个 \(\ge\lceil\dfrac{n}{2}\rceil\) 的条件不难让我们想到随机化,具体来说我们随机找一个人 \(x\),然后找出大小最大的子集 \(S\) 满足 \(S\) 符合要求且 \(S\subseteq A_x\)。显然我们随机取 \(20\) 个这样的 \(S\) 后出错概率就降到了 \(\dfrac{1}{2^{20}}\) 了。

接下来考虑如何求最大的符合要求且完全包含于 \(x\) 喜欢的货币的子集,由于 \(p\le 15\),我们直接枚举 \(A_x\) 的子集。直接统计是 \(2^p·n\) 的,容易想到优化方法:开一个桶维护 \(A_x\cap A_i\) 的出现次数,然后高维后缀和,这样复杂度即可降到 \(n+2^p·p\)

E

这个 E 不比 D 容易 \(10^9+7\) 倍(大雾

考虑将“第 \(i\) 步才使存在一个长度为 \(k\) 且至少包含两个亮着的灯的区间”的贡献 \(i\) 摊到前面“不存在长度为 \(k\) 的且至少包含两个亮着的灯“的时刻去计算,即枚举时刻 \(t\),算出 \(t\) 时刻不存在长度为 \(k\) 且至少包含两个亮着的灯的概率 \(f_t\),求和,再加 \(1\) 就是答案。

考虑如何计算 \(f_t\),我们设 \(p_1,p_2,\cdots,p_t\) 表示亮着的灯的位置,那么不难发现这等价于 \(p_i-p_{i+1}\ge k-1(i\in[1,t-1])\) 的概率,我们可以把这视作将 \(n-t\) 个球放入 \(t+1\) 个盒子,第一个和最后一个盒子可以为空,中间的盒子必须至少有 \(k-1\) 个球,插板法算出方案数后除以 \(\dbinom{n}{t}\) 就是概率。

F

vp 时候没 rush 出来,可惜了(不过即便 rush 出来了感觉我的做法也要卡一会儿常数才能过吧)

首先将所有任务按 \(t_i\) 从小到大排序。

下文称 \(xa_i,ya_i\) 表示第 \(i\) 个传送门的位置,\(xb_i,yb_i\)​ 表示第 \(i\) 个任务的位置。

考虑设 \(f_{S,i}\) 表示目前激活了 \(S\) 中的传送门,目前已经完成了 \(i\) 个任务,最早要到什么时候才能达成这个状态。再设 \(g_{S,i}\) 表示目前考虑了 \(i\) 之前的所有任务,当前 \(S\) 当中的任务被激活了,最多可以完成多少个任务,转移就分四种情况即可:

  • \(f\to f\)\(f_{S,i}+mna_{S,j}\to f_{S\cup\{j\},i}(j\notin S)\)
  • \(f\to g\)\(i\to g_{S,j}(f_{S,i}+mnb_{S,j}\le t_j)\)
  • \(g\to f\)​:\(t_j+\min(\text{dist}((xb_j,yb_j),(xa_i,ya_i)),mna_{S,i})\to f_{S\cup\{i\},g_{S,j}}\)
  • \(g\to g\)\(g_{S,i}+1\to g_{S,j}(t_i+\min(\text{dist}((xb_j,yb_j),(xb_i,yb_i)),mnb_{S,j})\le t_j)\)

其中 \(mna_{S,i}\)​ 表示从 \(S\)​ 中的点到达第 \(i\)​ 个传送门的位置所需的最小时间,\(mnb_{S,j}\)​ 表示从 \(S\)​ 中的点到达第 \(j\)​ 个任务的位置所需的最小时间。\(\text{dist}((x_1,y_1),(x_2,y_2))=|x_1-x_2|+|y_1-y_2|\)

当然对于我的做法而言,由于转移顺序不确定,需要用类似于 dijkstra 的方式存个堆维护当前转移的 \(f_{S,i}\)。这样复杂度是 \(2^n·m^2+2^nnm\log m\)不知道为什么有的人直接 DP 就过了,可能我人傻所以写法不那么美观吧 /kk

G

小清新数据结构题,vp 时候碰都没碰,感觉有点亏(

考虑从大到小枚举 \(x\)​ 并动态维护一个区间长度 \(\ge x\)​ 的区间集合 \(\{[l_i,r_i]|r_i-l_i+1\ge x\}\)​,那么考虑用一个分治的思想求解 \(x\)​ 的答案:定义函数 solve(L, R) 表示找出包含于 \([L,R]\) 且会被选择的区间,那么每次我们找到区间集合中 \(\subseteq[L,R]\) 且编号最小的区间 \([l_{id},r_{id}]\),答案加上 \(r_{id}-l_{id}+1\),然后继续分治 \([L,r_{id}-1],[l_{id}+1,R]\)​。

显然,对于一个 \(x\) 而言,最多只会有 \(\lfloor\dfrac{n}{x}\rfloor\) 个区间会被统计入答案,而找出编号最小的区间可以用树套树解决,这样复杂度就是 \(n\ln n\log^2n\)

H

怎么说呢……看了题解之后感觉这 H 完完全全就是一个可做题,可不是很能理解为什么现场没人过(当然,我自己也不会做 /dk,我也没有资格多评论这道题

首先这个模型很像 PKUSC2018 星际穿越,如果不考虑删点操作,那么从一个点开始走一定步数可以到达的点是一段区间,加上删点操作之后必然也是如此。因此我们考虑倍增。设 \(to_{i,j,x}\) 表示从 \(x\) 开始走 \(2^i\) 步,允许删 \(j\) 个点最远能到哪儿,那么显然有转移 \(to_{i,j,x}=\max\limits_{k_1+k_2=j}\max\limits_{t=x}^{to_{i-1,k_1,x}}to_{i-1,k_2,t}\)。ST 表优化转移即可实现 \(nk^2\log n+nk\log^2n\) 求解 \(to_{i,j,x}\)

接下来考虑如何回答询问,考虑从高往低一步步跳,设 \(ans_j\) 表示从 \(l\) 开始 \(2^j\)\(2^j\) 步地跳,在最优策略下能够跳到的最远位置 \(<r\),最多能跳多少步,再设 \(dp_{j,c}\) 表示从 \(l\) 开始 \(2^j\)\(2^j\) 步地跳,删了 \(c\) 个点,最远能够跳到哪儿,转移就类似于 \(to_{i,j,x}\) 的求解方法,枚举前 \(ans_j\) 步和后 \(2^{j-1}\) 步分别删了多少个点然后 ST 表合并即可算出新的 \(dp\) 值,如果新的 \(dp_{j-1,k}<r\) 就令 \(ans_j\) 加上 \(2^{j-1}\) 并更新 \(dp_{j-1,c}\) 为求得的新的 \(dp\) 值,否则令 \(dp_{j-1,c}=dp_{j,c}\)

还有一个小问题,就是此题空间只有 256MB,开 \(\log n·k\) 个 ST 表开不下。因此考虑将询问离线下来然后统一枚举 \(j\),在枚举 \(j\) 的同时对于每个 \(i\in[0,\max k_i]\) 建出 \(to_{j,i,x}\) 的 ST 表,这样就只用建 \(k\) 个 ST 表,就可以卡过空间限制了。

注意特判 \(l=r\) 的情况。

posted @ 2022-02-14 09:43  tzc_wk  阅读(82)  评论(0编辑  收藏  举报