首页 > 其他分享 >『板刷 AGC』[AGC017] A~E 做题记录

『板刷 AGC』[AGC017] A~E 做题记录

时间:2024-10-12 16:59:42浏览次数:8  
标签:AGC017 板刷 text 线段 AGC 拼图 数组 SG 我们

这场打得更菜了,只会 A,B,D,没办法,人机是这样的,我还是太菜了。

A: Biscuits

人机计数题。

一个直接的思路是把 \(a\) 的所有数对 \(2\) 取模,然后选出 \(m\) 个 \(a_i=1\) 的 \(i\) 满足 \(m\bmod 2=p\),而剩下的 \(a_i=0\) 的 \(i\) 就是可选可不选。设 \(s=\sum_{i=1}^n[a_i\bmod 2=1]\),则我们的答案为:

\[\sum_{m\bmod 2=p}C_s^m\times 2^{n-s} \]

B: Moderate Differences

人机智障题。

题目限制了相邻两项差分的值的绝对值在 \([C,D]\) 之中,于是我们可以根据差分数组来求出原数组,不难发现对于一个合法的差分数组 \(b\),我们无论怎样重排 \(b\),最后得到的原数组 \(a\) 也必然合法(这里的差分数组不考虑首项)。那么我们就可以把差分值为正的放到前面,把差分值为负的放到最后,这样我们得到的 \(a\) 就是一个上凸函数。

因此我们考虑构造这样一个序列 \(a\),满足 \(a_1=A,a_n=B\),且存在一个 \(k\) 满足 \(a\) 在 \([1,k]\) 这一段递增,在 \((k,n]\) 这一段递减。我们枚举这个 \(k\),求出 \(a_k\) 的取值范围为 \([A+(k-1)C,A+(k-1)D]\cup [B+(n-k)C,B+(n-k)D]\),本题只需要判断有无解,我们就直接判断这两个区间是否有交即可。

C: Snuke and Spells

人机思维题。

我们思考一下在合法的数组中删除每个数的过程,设 \(num(x)\) 表示 \(\sum_{i=1}^n[a_i=x]\),\(r\) 表示当前剩余的数的个数,那么接下来操作后剩余的数就是 \(r-num(r)\),即 \(r\leftarrow r-num(r)\)。记 \(f(r)=r-num(r)\),那么我们剩余的数的变化就是 \(n\to f(n)\to f(f(n))\to \dots\)。

观察这个形式,我们会发现它和倍增很像,因为倍增就是用来处理这种函数迭代 \(k\) 次的问题的。那我们就用一个类似的问题替换本题的外表。实际上就是在数轴上从 \(n\) 开始跳,设当前点为 \(x\),每次都会跳到 \(f(x)\) 这个点上,直到最后我们跳到了 \(0\) 这个原点。我们把每一次跳跃的过程想象为一条线段,即对于每个点 \(x\) 画一条覆盖 \([f(x),x]\) 的线段,那么对于一个合法的数组,我们的所有线段必然会覆盖 \([0,n]\) 这一段区间。对应的,我们的不合法数组就必然不能使得所有线段覆盖 \([0,n]\)。

由此,我们来考虑如何用最少的改变次数使得数组合法。假如我们把一个数 \(a_i\) 改为了 \(v\),那么 \(a_i\) 对应的 \([f(a_i),a_i]\) 线段就会缩成 \([f(a_i)+1,a_i]\),\(v\) 对应的 \([f(v),v]\) 线段就会增长为 \([f(v)-1,v]\)。也就是说每次修改最多会使得被覆盖的长度增加 \(1\)。因此我们的最少修改次数就是未被线段覆盖的长度。

Q:为什么不用考虑另一条线段缩短对长度带来的 \(-1\) 的影响呢?

A:因为根据定义有 \(\sum x-f(x)=n\),如果我们的线段不能覆盖完 \([0,n]\),就说明我们有许多的线段覆盖到了重复的区域,因此我们从贪心的角度来说,每次都缩短这些重复的线段,那么每次修改的代价就必然为 \(+1\)。

因此我们用差分维护一下每个点被覆盖的次数,然后对于题目给的修改,我们就分别缩短和增长对应的线段,动态维护答案即可。

D: Game on Tree

人机博弈题。

我们把当前的树的状态视作一个节点,对一次操作前后的两种状态连一条有向边,那么问题就变成了有向图博弈,考虑 \(\text{SG}\) 函数。

设 \(\text{SG}(x)\) 表示以 \(x\) 为根的子树 \(\text{Sub}(x)\) 的 SG 值。若 \(x\) 为叶子节点,显然有 \(\text{SG}(x)=0\),否则就要通过 \(\text{Sub}(x)\) 删除一棵内部的子树来进行转移。如果 \(x\) 存在多个儿子的话,设 \(f_{x,y}\) 表示 \(\text{Sub}(x)\) 中只保留 \(\text{Sub}(y)\) 这个儿子子树的 SG 值,则有 \(\text{SG}(x)=\bigoplus_{y\in \text{Son}(x)} f_{x,y}\),我们只需要知道 \(f_{x,y}\) 怎么求。

考虑一个性质,对于一条链,我们的 \(\text{SG}(i)=\text{mex}\{\text{SG}(1),\text{SG}(2),\dots,\text{SG}(i-1)\}=\text{SG}(i-1)+1\),因为 \(\text{SG}(1)=0\),所以这个我们就可以用归纳法证明。

运用这个性质,我们考虑在一条链上不断加点,使得链变成奇形怪状的树,我们在不断加点的过程中不断使用数学归纳法,就会发现每次加了一个点之后,这棵树的 SG 值就会变为原来的 SG 值加一。

于是我们就能得到 \(f_{x,y}=\text{SG}(y)+1\)。

因此我们的转移方程就是:

\[\text{SG}(x)= \begin{cases} 0 & |\text{Son}(x)|=0 \\ \bigoplus_{y\in \text{Son}(x)}\text{SG}(y)+1 & \text{otherwise} \end{cases} \]

E: Jigsaw

人机图论题。

不难得到一个思路,就是对于两个拼图 \(i,j\),如果 \(i,j\) 能够左右相接,就在 \(i,j\) 之间连边,最后就是判断所有点能否连接成若干条链。

但是暴力建边是 \(O(n^2)\) 的,我们考虑根据 \(H\) 这个变量优化一下,因为它的范围很小。对于一个拼图 \(i\),我们定义两个值 \(l_i,r_i\),有:

\[l_i= \begin{cases} a_i & c_i=0 \\ -c_i & \text{otherwise} \end{cases} ~~~r_i= \begin{cases} b_i & d_i=0 \\ -d_i & \text{otherwise} \end{cases} \]

则对于两个拼图 \(i,j\),如果 \(r_i+l_j=0\),则 \(j\) 可以接在 \(i\) 的右边。我们朝图论的方向进一步转换,可以发现等号的转换可以构成一张图,因此我们可以让 \(l_i\leftarrow -l_i\),然后条件就变成了 \(r_i=l_j\)。考虑对每个拼图 \(i\) 建立一条 \(l_i\rightarrow r_i\) 的有向边,此时拼图就相当于一条边,值域上的每一个数就变成了点。

因此,对于一个拼图序列 \(A\),如果我们可以顺次把 \(A\) 中的所有拼图拼在一起,则我们就一定可以在图上找到一条包含这些拼图对应的边的有向路径。于是问题就变成了能否在 DAG 上找到经过所有边的路径,且保证起点为一个负权,终点为一个正权。

根据半欧拉图判定,设 \(\text{deg}_i=\text{in}_i-\text{out}_i\),我们知道一个 DAG 存在一条欧拉路径当且仅当至多一个顶点的 \(\text{deg}\) 等于 \(-1\),至多一个顶点的 \(\text{deg}\) 等于 \(1\),其余点的 \(\text{deg}\) 等于 \(0\)。不难想到 \(\text{deg}\) 等于 \(-1\) 的必然是起点,等于 \(1\) 的必然是终点,而我们本题还要使得起点为负权,终点为正权,因此我们还要加上这两个条件。

此外,我们知道一个 DAG 中若所有点的 \(\text{deg}\) 都等于 \(0\),那么整张图就是欧拉图而不是半欧拉图,因此我们选出的欧拉路径全部都是欧拉回路,这显然是不合法的。因此我们还需要判掉这个情况。

按照上面的条件依次判断就行了。时间复杂度 \(O(n+H)\),我也不知道为什么 \(H\) 开得比较小。

标签:AGC017,板刷,text,线段,AGC,拼图,数组,SG,我们
From: https://www.cnblogs.com/SuporShoop/p/18460893

相关文章

  • [AGC054D] (ox) 题解
    感觉看到交换就应该要想到逆序对。思路一个前置小知识,我们把一个排列用相邻交换复原的最小次数是逆序对数量。考虑没有ox的情况。我们顺着扫一遍字符串。把左括号正一,右括号看作负一,当前缀和小于零以后,我们把后面最近的左括号提过来,这样可以构造出交换次数最少的合法括号串......
  • 『板刷 AGC』[AGC016] A~E 做题记录
    远古的一场AGC,能够把前四题做出来,后面两个看了题解还是只会E,F是最近才拉过的一道题,但我不会,没办法我还是太菜了。。A:Shrinking人机签到题。先枚举我们最终保留的字符\(c\),然后我们就按照题意模拟一边,每次从\(s\)更新到新的字符串\(s'\)的时候,我们希望得到的\(s'\)......
  • AGC005 题解
    目录A-STringB-MinimumSumC-TreeRestoringA-STring用栈模拟一下即可,具体的,当栈顶出现形如ST时,将其弹出。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llRead(){ intsig=1; llnum=0; charc=getchar(); while(!isdigit(c))......
  • [AGC064D] Red and Blue Chips 题解
    Description你有\(N\)个字符串,初始情况下每个字符串只有一个字符,是\(\texttt{R}\)或\(\texttt{B}\),保证第\(N\)个字符串是\(\texttt{B}\)。你需要对每个\(i=1,2,\cdots,n-1\)执行以下操作:选择一个整数\(j\)使得\(i<j\len\),且第\(j\)个字符串的最后一个字符......
  • [AGC064C] Erase and Divide Game 题解
    DescriptionTakahashi和Aoki玩游戏。先在黑板上写若干个数,由\(N\)个互不相交的区间\([l_i,r_i]\)组成。两人轮流操作,每次操作先删去所有的奇数/偶数,再把剩下的数除以\(2\)(向下取整),无法操作的人输。Takahashi先手,假设两人都采用最优策略,问谁能获胜。\(1\leqN\leq10^......
  • [AGC061C] First Come First Serve 题解
    Description有\(n\)个人来过,第\(i\)个人在\(a_i\)时刻来在\(b_i\)时刻走,每个人可以在来时或走时登记,问可能的登记顺序有多少种。\(n\leq5\times10^5\),\(a_i,b_i\)互不相同,\(\foralli<n,a_i<a_{i+1},b_{i}<b_{i+1}\)。Solution首先如果每个人随便选,有\(2^n\)种方......
  • AGC068A 做题记录
    很好的组合数学题。考虑以任意一个点为基准计算方案数,最终答案乘上\(\dfracLn\)即可。枚举点两两之间最短路径\(\led\),计算方案数,剩下的\(n-1\)个点都应该至多在基准点的左\(d\)个和右\(d\)个点的位置。显然左右\(d\)个位置内部的距离都不超过\(d\),只需要判定......
  • [AGC017C] Snuke and Spells
    题意给定\(n\)个球,每个球上有一个数字\(a_i\)。每当魔法少女施展魔法时,会将写着当前球的数量的球全部消除。\(q\)次修改球的值,你需要在基础上修改最小的次数使得这\(n\)个球可以被魔法少女消除,求出你修改的最小次数。\(n\le2\times10^5\)。Sol神题!由于修改至......
  • [AGC056B] Range Argmax
    发现一个序列\(x\)不止可以用一个\(p\)得到,肯定不能直接计数,考虑构造一个映射。假如已经定下了\(x\),我们通过一种固定的操作得到\(p\),这样就能改为统计可以由操作得到的\(p\)的数量,他们同样唯一对应一个\(x\)。我们考虑枚举从\(n\)到\(1\)去枚举\(v\),对每个\(v\)......
  • tagcloud.js 实现3d 云标签
    我这个布局是准备在中间放一张图片,两边的便签在图片的左右两边区域动。中间图片自己放,每个标签鼠标放上去会放大并停止。效果如下:3d云标签注意:标签样式可以自行修改,tagcloud参数配置中,如果有的标签在区域内边界会被遮住,就通过radius和direction调节即可。完整代码如下......