首页 > 其他分享 >WC2023 做题记录

WC2023 做题记录

时间:2023-01-16 17:57:48浏览次数:45  
标签:frac 记录 h2 复杂度 白点 WC2023 序列 Theta

Day1 下午

Hammer to Fall

题意:

给你一张 \(n\) 个点 \(m\) 条边的边权非负的无向图,每个点上有 \(a_i\) 个人。

总共经过 \(q\) 天,每天结束时轰炸一个节点 \(b_i\) 。

每天每人可以以无限快的速度移动到任何地方,但在这一天结束时必须要停留在一个不被轰炸的节点上。否则他就会被炸死。

保证没有孤立点,则必然存在一种没有人被炸死的走法。

现在问你所有没有人被炸死的走法中,每个人所走距离之和的最小值。

数据范围:\(n,m,q \le 10^5\)。

思路:

显然人与人之间相互独立。

对于一个人,以下策略一定不劣:

  • 如果这天不会轰炸他所在点,那他这天不动。
  • 如果这天轰炸他所在点,移动到一个相邻点。

考虑一个 \(\text{dp}\),\(f_{i,j}\) 表示第 \(i\) 天早上在 \(j\) 号点需走距离的最小值。

相同起点的人策略一定相同,因此时间复杂度 \(\Theta(nq(n+m))\)。

考虑把状态抽象成点,转移抽象成边,建出一张图。

图有 \(q+1\) 层,第 \(i\) 层第 \(j\) 个点表示第 \(i\) 天的第 \(j\) 号点。

然后有一个汇点 \(t\)。

对于点 \((i,j)\):

  • 如果 \(i=q+1\),从 \((i,j)\) 向 \(t\) 建一条权为 \(0\) 的边。

  • 如果 $i \not = q+1 $ 且 $ j \not =b_i$,从 \((i,j)\) 向 \((i+1,j)\) 建一条权为 \(0\) 的边。

  • 如果 $i \not= q+1 $ 且 $ j=b_i$,对于所有 \(k\) 满足原图上存在一条 \((j,k,l)\) 的边,建一条 \((i,j)\) 向 \((i+1,k)\) 建一条权为 \(l\) 的边。

对于初始在点 \(i\) 的人,他活下来走的最小距离就是 \((1,i)\) 到 \(t\) 的最短路径的长度。

因此我们只要求出 \(\forall i \in[1,n],(1,i)\) 到 \(t\) 的距离即可。

考虑到这个一个多源单汇最短路,把边反过来即可做到只用做一次单源最短路。

发现这是显然是一个 \(\text{DAG}\),并且拓扑序非常显然,所以可以搞出一个 \(\text{dp}\)。

令 \(g_{i,j}\) 表示第 \(i\) 天早上在 \(j\),活到最后需要走的最短距离。

初值是 \(\forall{i \in[1,n]},g_{q+1,i}=0\)。

\(g_{i,j}\) 的转移:

  • \(j \not = b_i\),\(g_{i,j}=g_{i+1,j}\)。
  • \(j=b_i\),\(g_{i,j}=\min_{j\to k} w(j,k)+g_{i+1,k}\)。

显然可以压掉一维。

时间复杂度显然是 \(\Theta(q(n+m))\),一个菊花,然后每次修改花心就可以卡到了。

发现复杂度与度数相关,而度数这个东西非常好根号分治。

令阈值为 \(B\)。

  • 对于所有 \(d_i\le B\) 的点,如果它在某一天要被修改了,直接暴力修即可。

  • 对于所有 \(d_i >B\) 的点,显然最多 \(\frac{2m}{B}\) 个。

    我们给他们每个 \(i\) 维护一个 \(set\),维护 \(\min_{i \to k} w(i,k)+g_{i+1,k}\)。

    每天修改的时候暴力维护 \(set\) 即可。

每天修改时间复杂度 \(\Theta(B)\),维护 \(set\) 时间复杂度 \(\Theta(\frac{m}{B}\log{n})\),总共的时间复杂度是 \(\Theta(qB+q \frac{m}{B}\log n)\) 的。

显然 \(B\) 取 \(\sqrt{m \log n}\) 最优,时间复杂度 \(\Theta(q\sqrt{m\log n})\)。

黑白点

题意:

给你一个环,环上有 \(2n\) 个点,\(n\) 个白点,\(n\) 个黑点。

(输入给出黑白点的分部)

现在要你将黑点和白点一一匹配,匹配的点对连上一条边。

请你最大化相交的边对数。输出最多有多少对边相交。

数据范围:\(n \le 2 \times 10^5\)。

思路:

显然,下图中左结构严格劣于右结构:

因此存在左结构的方案必然不是最优方案。

由此可以得到结论:

令顺时针第 \(i\) 个黑点为 \(B_i\),第 \(i\) 个白点为 \(W_i\)。(令 \(B_i\) 新编号为 \(i\),\(W_i\) 新编号为 \(i\))

那么如果 \(B_i\) 匹配了 \(W_j\),那 \(B_{(i\bmod n)+1}\) 必然匹配 \(W_{(j\bmod n)+1}\),否则一定不优。

可以通过分类讨论证明,如果不这么连,就一定出现左结构。

因此,只要确定了 \(1\) 号黑点匹配哪个白点,那就确定了整个匹配方案。

令 \(f_i\) 为 \(1\) 号黑点匹配 \(i +1\) 号白点的方案的相交边对数。(也就是匹配白点新编号减黑点新编号与 \(i\) 模 \(n\) 同余的方案)

我们要求的就是 \(\max{f_i}\)。

假设 \(c_e\) 为与边 \(e\) 相交的边数,那么 \(f_i=\frac{\sum c_e}{2}\)。

令 \(g_i=\sum c_e\),那 \(\max{f_i}=\frac{\max{g_i}}{2}\)。计算出 \(g_i\) 即可。

考虑对 \(g_i\) 拆贡献,拆成每条边的 \(c_e\) 之和。

对于一个黑点 \(i\),假设它匹配了白点 \(j\),我们考虑 \(c_{(i,j)}\) 的值。

令一条弧 \(h\) 上黑点个数为 \(b_h\) 白点个数为 \(w_h\)。

令 \(i\) 沿顺时针到 \(j\) 的弧为 \(h1\),\(i\) 沿逆时针到 \(j\) 的弧为 \(h2\)。(均不包含端点)

那 \(c(i,j)=\min(b_{h1},w_{h2})+\min(b_{h2},w_{h1})\)。

考虑到 \(b_{h1}+b_{h2}=w_{h2}+w_{h1}=n-1\)。

带入得到 \(c(i,j)=\min(b_{h1}+w_{h1},b_{h2}+w_{h2})\),即两条弧上点数的最小值。

考虑到弧上点数可以通过前缀和拆给两个端点贡献,具体拆法如下:

如果一个端点可以顺时针沿弧走到另一端点,令其为前端。否则为后端。

前端贡献其原编号的相反数,后端贡献其原编号减一。

如果该弧跨过 \(n\) 和 \(1\),那么前端再贡献 \(2n\)。

问题就是要知道一个点什么时候是前端,什么时候是后端,也就是怎样拆掉 \(\min\)。

考虑对于一个黑点 \(i\)。

我们从 \(i\) 后第一个白点绕一圈得到 \(W^i\),使得 \(i\) 到 \(W^i_{j}\) 中的白点 \(h1\) 弧上点数递增,\(h2\) 弧上点数递减。(对应 \(W\) 复制两遍后的一个区间)

那么,一定存在一个唯一白点 \(p_i\),使得 \(i\) 与 \(W^i_1\sim W^i_{p_i}\) 的白点连成边的贡献都是 \(h1\) 弧上的点数,与 \(W^i_{p_i+1} \sim W^i_{n}\) 的白点连成的边的贡献都是 \(h2\) 弧上的点数。

也就是说,\(i\) 对 \(i\) 与 \(W_1^i\) 相连的方案,\(i\) 与 \(W_2^i\) 相连的方案,\(\cdots \cdots\),\(i\) 与 \(W_{p_i}^i\) 相连的方案,贡献都相等。

\(i\) 对 \(i\) 与 \(W_{p_i+1}^i\) 相连的方案,\(i\) 与 \(W_{p_i+2}^i\) 相连的方案,\(\cdots \cdots\),\(i\) 与 \(W_{n}^i\) 相连的方案,贡献都相等。

这两种方案 \(i\) 连点实质上是两段连续的白点弧。所以对应方案也是连续的,直接差分即可。

注意作为前端时,肯能跨过了 \(n\) 和 \(1\),要把那一段的贡献加上 \(2n\)。

白点类似。

通过双指针得到 \(p_i\),时间复杂度 \(\Theta(n)\)。

Counting Sequence

题意:

定义一个序列 \(A\) 是好的当且仅当:

  • \(\forall i \in [1,|A|],A_i~\text{是正整数}\)。
  • \(\forall i \in[1,|A|-1],|A_i-A_{i+1}|=1\)。
  • \(\sum A_i=m\)。

定义一个序列 \(A\) 的权值为:

\[val(A)=\sum_{i\in [1,|A|-1]} {[A_i > A_{i+1}]} \]

给定 \(m\) 和一个数 \(c\)。

让你求:

\[\sum_{A} c^{val(A)} \cdot [A~ \text{是好的序列}] \]

数据范围:\(m \le 3 \times 10^5\)。

思路:

显然答案拆给所有好的序列贡献。

考虑到好的序列的元素之和给定,且元素均为正整数,并且相邻两项差很小。因此元素值不可能和长度同时较大。

具体而言,我们考虑根号分治。

设阈值为 \(B= \sqrt{2m}\)。

直觉上是按照最大值进行分治,但最大值不能确定具体是哪一位,容易算重,不好讨论,因此考虑对 \(A_1\) 进行分治。

对于所有 \(A_1 \le B\) 的好的序列:

此时 \(\max{A_i} \le B + \frac{m}{B}\)。

因为如果 \(\max{A_i} > B + \frac{m}{B}\),那 \(B+1 \sim B+\frac{m}{B}\) 必然全部存在,那和必然爆 \(m\)。

令 \(f_{i,j}\) 为和为 \(i\),末项为 \(j\) 的好的序列的权值之和。

转移:

  • 如果 \(i=j\),\(f_{i,j}=1\)。
  • 如果 \(i > j\),\(f_{i,j}=f_{i-j,j-1}+c \cdot f_{i-j,j+1}\)。

时间复杂度 \(\Theta(m \cdot (B+\frac{m}{B}))\)。

对于所有 \(A_1 > B\) 的好的序列:

此时序列长度必然小于 \(B\),因为如果序列有至少 \(B\) 位,那总和必然大于 \(\frac{B^2}{2}=m\)。

因为序列长度小于 \(B\),所以必然全都是正整数,也就不用考虑条件一了。

此时元素值较大,显然不能直接用元素值 \(\text{dp}\)。

考虑到相邻两位差分值只有 \(1\) 和 \(-1\) 两种取值,并且权值只与差分序列相关,所以考虑对差分值进行 \(\text{dp}\)。

由于差分值强制为 \(1\) 和 \(-1\),所以条件只剩总和为 \(m\)。

令序列 \(B\) 为差分序列,即 \(\forall i \in [1,|A| - 1],B_i=A_{i+1}-A_{i}\)。

总和为:

\[A_1 \cdot |A|+\sum_{i \in [1, |A| - 1]}{B_i \cdot (|A| - i)} \]

令 \(g_{i,j}\) 表示所有长度为 \(i\),对总和贡献为 \(j\) 的合法差分序列对应的原序列的权值总和。

考虑到向前扩展可以使所有原来的差分值贡献不变,只需考虑新扩展元素对总和贡献,因此考虑向前扩展。

初始状态显然是 \(g_{0,0}=1\)

转移:

  • \(g_{i+1,j+i}\gets g_{i,j}\)
  • \(g_{i+1,j-i} \gets c \cdot g_{i,j}\)

最后枚举 \(A_1\) 和 \(|A|\),满足条件的好的序列的贡献之和显然是 \(g_{|A|-1,m- A_1 \cdot |A|}\)。

时间复杂度 \(\Theta(B \cdot m)\)。

总时间复杂度 \(\Theta(m \sqrt{m})\)

标签:frac,记录,h2,复杂度,白点,WC2023,序列,Theta
From: https://www.cnblogs.com/zzzYheng/p/17056013.html

相关文章

  • C语言家庭日常消费记录管理系统
    C语言家庭日常消费记录管理系统题目:家庭日常消费记录管理系统一、功能需求说明(必须采用动态链表实现)1.消费记录存在文件fee.dat中格式如下:每一条记录包括一个消费......
  • cita-sdk react16.9 依赖安装及运行问题经验记录
    运行环境查找选择node稳定版本发布时间,技术框架发布时间一致即可nodev10.18.0reactv16.9.0pythonv2.7.18安装cita-sdk一直报错上面两个错误一直循环报错,但最后......
  • 【问题记录】【VUE】【vue-pure-admin】ElPagination你使用了一些已被废弃的方法,导致
    1 问题描述最近在看vue-pure-admin(一个前端框架),框架挺好的正常该有的都有,主要是使用比较简单,使用表格组件的时候,会出现一个报错,分页组件会莫名的报错。2 解决办......
  • WC2023:在那开始的之后
    NOIP结束了。我砸了,这意味着初三的整个赛季都注定做不了什么了。想着九上已经过去了,不想赖在之前的那个坑里了,打算借助WC,再刻画一段日常。我需要一个契机,来封存正在发......
  • 奇安信 2022年第二季度App收集个人信息检测报告 学习记录
    声明本文是学习2022年第二季度App收集个人信息检测报告.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们无提示收集个人信息情况分析无提示收集......
  • git使用问题记录
    hint:Updateswererejectedbecausetheremotecontainsworkthatyoudo问题原因:远程仓库中含有本地仓库没有的文件直接拉取会拒绝解决方法:gitpulloriginm......
  • 学习记录-原型模式
    原型模式原型模式(PrototypePattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原......
  • 【博学谷学习记录】超强总结,用心分享 | pyspark基础操作
    【博学谷IT技术支持】Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生,2010年开源,2013年成为Apache孵化项目,2014年成为Apache顶级项目。目前,Spark生态系统已经发......
  • AJAX使用记录
    目录什么是AJAXAJAX的工作流程省市二级联动案例AJAX的使用总结什么是AJAXAJAX=AsynchronousJavaScriptAndXML.我感觉AJAX是一个有点误导性的名称。让人觉得AJA......
  • debian11 bspwm+polybar问题记录(siji字体无法正常显示)
    很懒很菜,就想用开箱即用的原始配置依然遇到了问题。。。plybar中的bitmap字体siji无法正常显示。即便按照github的siji官方脚本安装了siji字体还是不行。幸好polybar......