AT 经典90题(031-060)

31.VS AtCoder

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

32.AtCoder Ekiden

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

33.Not Too Bright

先特判 nm1 的情况。对于其他情况答案就是 n2×m2

34.There are few types of elements

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

35.Preserve Connectivity

经典结论,先把给出的点按照 dfn 排序。求的东西就是 i=1k(depvi)i=2k(deplca(vi1,vi))deplca(v1,vk)

36.Max Manhattan Distance

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

37.Don't Leave the Spice

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

38.Large LCM

比较 1018agcd(a,b)b 的大小即可。如果使用了浮点数注意浮点数会有误差。

39.Tree Distance

考虑换根 dp,先算出 1 到其他点的距离之和。然后尝试把根换成儿子,再算一下这个点到其他点的距离之和。不难发现若根从 u 换到 u 的儿子 j,那么假设 fi 表示点 i 到其他点的距离之和,则 fj=fu+nsizj×2

答案就是 f 之和的一半。

40.Get More Money

我们设源点为 0,汇点为 n+1。只需在网络流中连边 (0,i,ai),(i,n+1,m),jki,(ci,j,i,inf),这里 m 是原题中的 w,反边的边权全部为 0。然后答案就是 i=1nai 减去这张图的源点到汇点的最小割。

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

41.Piles in AtCoder Farm

考虑毕克定理,S=n+l21。于是我们考虑算出 Sn

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

42.Multiple of 9

首先 k 不是 9 的倍数答案为 0。然后设 fi 表示 k=i 时的答案,转移 fi=j=19fij,注意这里不能越界。答案就是 fk

43.Maze Challenge with Lack of Sleep

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

44.Shift and Swapping

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

45.Simple Grouping

考虑状压 dp,设 fi,j 表示集合为 j 的部分分成 i 组的答案。不难发现答案就是 fk,2n1。转移就是对于 j 的子集 sfi,j=min(fi,j,max(fi1,js,vals)),其中 vals 表示把 s 集合划分造成的贡献。

46.I Love 46

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

47.Monochromatic Diagonal

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

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

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

48.I will not drop out

考虑把 aibibi 都插入到一个数组里,然后排序取前 k 大即可。

49.Flip Digits 2

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

50.Stair Jump

fi 表示上到第 i 格的方案数,则有转移 fifi1+fil,初始 f0=1。注意 i<l 时认为 fil0

51.Typical Shop

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

52.Dice Product

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

53.Discrete Dowsing

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

54.Takahashi Number

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

55.Select 5

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

56.Lucky Bag

考虑设 fi,j 表示前 i 个物品能否凑出 jgi,j 表示当 fi,j1 时他从什么转移。于是输出方案暴力向回跳即可。

57.Flip Flap

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

58.Original Calculator

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

59.Many Graph Queries

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

60.Chimera

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

posted @   zxh923  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示