AT 经典90题(031-060)

31.VS AtCoder

考虑 sg 函数,每次异或上 \((w_i,b_i)\) 的 sg 函数看最后是不是 \(0\) 即可。注意 \(b\) 那一位的上界为 \(1500\) 而不是 \(50\)

32.AtCoder Ekiden

考虑全排列枚举跑步顺序并判断不合法即可。

33.Not Too Bright

先特判 \(n\)\(m\)\(1\) 的情况。对于其他情况答案就是 \(\lceil\frac{n}{2}\rceil\times\lceil\frac{m}{2}\rceil\)

34.There are few types of elements

考虑使用双指针,如果 \(r\) 能右移就右移。最后把所有这样的区间长度取最大值即可。

35.Preserve Connectivity

经典结论,先把给出的点按照 dfn 排序。求的东西就是 \(\displaystyle\sum_{i=1}^{k}(dep_{v_i})-\sum_{i=2}^{k}(dep_{lca(v_{i-1},v_i)})-dep_{lca(v_1,v_k)}\)

36.Max Manhattan Distance

直接曼哈顿转切比雪夫,然后答案就是当前的点的 \(x\)\(x\) 的极值做差的绝对值和当前的点的 \(y\)\(y\) 的极值做差的绝对值的较大值。

37.Don't Leave the Spice

考虑朴素背包 \(f_{i,j}\) 表示前 \(i\) 个物品花费 \(j\) 香料的最大收益,发现朴素转移会超时。不难发现每次转移是从一段连续的区间的最大值。这个东西显然可以使用线段树维护。于是转移的时候直接再线段树里查询最大值即可。

38.Large LCM

比较 \(\lfloor\frac{10^{18}}{\frac{a}{\gcd(a,b)}}\rfloor\)\(b\) 的大小即可。如果使用了浮点数注意浮点数会有误差。

39.Tree Distance

考虑换根 dp,先算出 \(1\) 到其他点的距离之和。然后尝试把根换成儿子,再算一下这个点到其他点的距离之和。不难发现若根从 \(u\) 换到 \(u\) 的儿子 \(j\),那么假设 \(f_i\) 表示点 \(i\) 到其他点的距离之和,则 \(f_j=f_u+n-siz_j\times 2\)

答案就是 \(f\) 之和的一半。

40.Get More Money

我们设源点为 \(0\),汇点为 \(n+1\)。只需在网络流中连边 \((0,i,a_i),(i,n+1,m),\forall j\le k_i,(c_{i,j},i,inf)\),这里 \(m\) 是原题中的 \(w\),反边的边权全部为 \(0\)。然后答案就是 \(\displaystyle\sum_{i=1}^{n}a_i\) 减去这张图的源点到汇点的最小割。

割掉源点连出边的意义是不去这个点,割掉一个点到汇点的边的意义是这条边要选,所以要花费 \(m\)。割掉钥匙边为 \(inf\) 的原因是只有拿到钥匙才能到达这个点,所以这条边不能割。

41.Piles in AtCoder Farm

考虑毕克定理,\(S=n+\frac{l}{2}-1\)。于是我们考虑算出 \(S\)\(n\)

不难发现连出的图形一定是一个凸包,凸包的 \(S\)\(l\) 都是好求的。求出来之后直接代入公式算出 \(n\)。最后答案就是 \(l+n-N\)

42.Multiple of 9

首先 \(k\) 不是 \(9\) 的倍数答案为 \(0\)。然后设 \(f_i\) 表示 \(k=i\) 时的答案,转移 \(\displaystyle f_{i}=\sum_{j=1}^{9}f_{i-j}\),注意这里不能越界。答案就是 \(f_k\)

43.Maze Challenge with Lack of Sleep

考虑每个点有一个状态 \((x,y,k)\) 表示当前再 \((x,y)\),面朝 \(k\)。于是发现可以建出图,直接跑最短路即可。

44.Shift and Swapping

直接使用 deque 模拟这一过程即可。注意 deque 的下标从 \(0\) 开始。

45.Simple Grouping

考虑状压 dp,设 \(f_{i,j}\) 表示集合为 \(j\) 的部分分成 \(i\) 组的答案。不难发现答案就是 \(f_{k,2^n-1}\)。转移就是对于 \(j\) 的子集 \(s\)\(f_{i,j}=\min(f_{i,j},\max(f_{i-1,j-s},val_s))\),其中 \(val_s\) 表示把 \(s\) 集合划分造成的贡献。

46.I Love 46

考虑本质不同的数再每个序列中至多出现 \(46\) 种。于是枚举每个序列种出现的是哪种数。简单把数量乘起来求个和即可。

47.Monochromatic Diagonal

不难发现如果这一条对角线合法,等价于 \(s\) 的前缀与 \(t\) 的后缀相同。但是,会出现 \(B+B\) 等价于 \(R+G\) 的情况。

\(R\) 值为 \(0\)\(G\) 值为 \(1\)\(B\) 值为 \(2\)。我们对于 \(i\)\(0/1/2\),将 \(t_j\leftarrow (i-t_j+3)\bmod 3\)。然后用哈希判 \(s\) 有几个前缀和 \(t\) 的后缀相同,\(s\) 有几个后缀和 \(t\) 的前缀相同(注意不要重复)。这个东西的和就是答案。

分类讨论一下即可证明上面的操作是对的。

48.I will not drop out

考虑把 \(a_i-b_i\)\(b_i\) 都插入到一个数组里,然后排序取前 \(k\) 大即可。

49.Flip Digits 2

经典套路,对于每个区间连一条 \(l-1\)\(r\) 边权为 \(c\) 的边,然后跑最小生成树即可。这里每条边代表这两个点的值可以不同花费的代价。

50.Stair Jump

\(f_i\) 表示上到第 \(i\) 格的方案数,则有转移 \(f_i\leftarrow f_{i-1}+f_{i-l}\),初始 \(f_0=1\)。注意 \(i<l\) 时认为 \(f_{i-l}\)\(0\)

51.Typical Shop

考虑把序列拆成两半考虑,算出前一半用 \(i\) 个能凑出什么,后一半用 \(i\) 个能凑出什么,用 vector 记录一下。然后枚举前一半选什么,二分后一半有多少种合法选法即可。

52.Dice Product

不难发现答案为每个骰子上的数的和的乘积,注意取模即可。

53.Discrete Dowsing

考虑使用黄金分割法求出单峰函数的极值,具体可以搜索一下这个东西,这里只做简要介绍。大致就是每次显然可以判断出一部分区间不再合法,把不合法那边的端点挪到另一个端点上,然后重复这一过程。

54.Takahashi Number

把每个人与所在论文连一条边权为 \(1\) 的边。于是每个点的答案就是到 \(1\) 的距离的一半(不连通即为无解)。

55.Select 5

暴力枚举选哪 \(5\) 个位置即可。

56.Lucky Bag

考虑设 \(f_{i,j}\) 表示前 \(i\) 个物品能否凑出 \(j\)\(g_{i,j}\) 表示当 \(f_{i,j}\)\(1\) 时他从什么转移。于是输出方案暴力向回跳即可。

57.Flip Flap

我们使用高斯消元法求出拼出该状态最少需要多少开关,剩下的都是自由元。然后先把无解判掉,否则每个自由元都可以选或不选,答案就是 \(2\) 的自由元数量次方。

58.Original Calculator

不难发现变化过程是一条链加一个环,只需把在环上走的步数对环长取模即可。

59.Many Graph Queries

考虑到每次处理一个询问太慢,且图是有向无环的,于是每次处理 \(64\) 个即可。

60.Chimera

我们设 \(i\) 为峰,显然可以找出 \(i\) 结尾的 LIS 长度和 \(i\) 开始的 LDS 长度,答案就是对于所有 \(i\) 这两个东西的加和减去 \(1\) 的最大值。至于长度,使用树状数组优化即可快速求出。

posted @ 2024-11-01 13:06  zxh923  阅读(126)  评论(0)    收藏  举报