ATCoder 1600-2400 乱做

ABC234E [dif:1637]

给你一个 n 个点 m 条边的图,设 disu,v 表示 u,v 之间的最短路,问最多删几条边 disu,v 仍然不变。n300,mn(n1)2

Floyd 然后枚举每条边,对于每条边 (u,v) 枚举每个点 x 判断是否有满足 disu,x+disx,vw(u,v) ,如果有的话这边就可以拜拜了。

注意 Floyd 初始化时不要把 dis0,0 赋为 0。这样的话如果满足上面这个判断条件,说明存在一条经过两条边或更多边的路径的长度和比这条边短。

如果一条最短路的话边肯定越多越好,考虑一下两条边 (u,x)(x,v) 的和如果和 (u,v) 等长,那么 w(u,x)w(x,v) 一定比 w(u,v) 小,那样删掉 w(u,v) 一定比删剩下两条中的一条优。

时间复杂度 O(n3+mn)

ABC234F [dif:2125]

n 个数,第 i 个数的权值为 wi,一个数被选中的概率为 wijwj

求选择 K 次,恰好有 M 个不同的数的概率。对 998244353 取模。

fi,j,k 表示前 i 个数选了 j 次有 k 个不同的数的概率。考虑枚举第 i 个数选了几次进行转移。

fi,j,k=xfi1,jx,k[x>0]×(jx)×cix

然后就做完了。。。

时间复杂度 O(nmK2)

ABC234G [dif:2032]

T 组询问,每次询问给定一个序列,初始只有一个数 x,每次向序列末尾加一个数 y ,设当前末尾的数为 z,则 1yz ,一共要加 10100 次,求可能产生多少种不同的序列。

T20,x9×1018

考虑预处理出 1x4 的答案,然后做一个前缀和,然后去枚举 i,1ix4 (这一步是在确定第三个数可以填啥),然后对于每个 i 对应第二位可以填的数是 [i2,(i+1)2) ,可直接算出有多少个数,直接暴力枚举一下即可。

时间复杂度 O(TX4)

ABC238F [dif:2058]

n 个人,每个人有两个权值 pi,qi,保证序列 p,q 是一个 1n 的排列。

现在让你选 K 个人,问方案数,对 998244353 取模。限制是不存在一个未选的人 x 和一个已选的人 y 满足 px>pyqx>qy

Kn300

先按照第一关键字从小到大排序。

fi,j,k 表示前 i 和里面选了 j 个未选择的人的最小值为 k 时的方案数。则有

fi,j,k=fi1.j1,k[ai<k]fi,j,min{ai,k}=fi1,j,k

答案为 i=1nfn,K,i

第一维可以用滚动数组优化掉。

时间复杂度 O(n3)

ABC237F [dif:1857]

求满足下列条件的序列有多少种:长度为 n;每个元素的值满足 1xM;最长上升子序列的长度恰好为 3

3n1000,3m10

fi,j,k,l 表示前 i 个数,最长上升子序列为 j,k,l 的方案数。

则有转移方程:

fi,x,k,l=xjfi,j,k,lfi,j,x,l=j<xkfi,j,k,lfi,j,k,x=k<xlfi,j,k,l

考虑求 LIS (最长上升子序列)时那个 O(nlogn) 的做法,维护 LIS 每个位置的最小值。

由于这里 LIS 长度只有 3 且值域很小,直接将其设为状态维护即可。

时间复杂度为 O(nm4)

ABC237G [dif:2088]

给你一个长度为 n 的排列,Q 次操作,一个数 x

操作分两种:区间升序排序 和 区间降序排序。

求最后 x 所在位置。

1N,Q2×105

发现我们只需要关注与 x 的大小关系即可。

考虑这样一个做法,把 x 的数置为 1,其他为 0,然后用线段树维护区间覆盖和求和就可以简单维护。

再取一个序列把 >x 的数置为 1,其他为 0,其他做法同上。

发现只有一处不同的地方,那便是 x 所在。

时间复杂度 O(n+Qlogn)

ARC134D [dif:1998]

给你一个长度为 2n 的序列 a,每次要同时选择 aiai+n,问得到的子序列(下标必须递增)的字典序最小是多少?

ax=min1in{ai} ,若 ax>ax+n 那么选它即可。

axax+n,把所有 =ax 的元素选上是最优的。

再考虑选完这些元素之后,如果有 aj=ax+n 那么还要确定选他会不会更优。

时间复杂度 O(n+nlogn)

ABC235F [dif:2129]

告诉你有那几个数能用,然后求有多少 xn ,满足 x 中存在所有能用的数。

n10104

数位 DP 狗都不做。

(逮捕)

ABC234G [dif:2306]

给你一个长度为 n 的序列 a,可以把它随意分成若干段。设分成了 B1,B2,...,Bk 这几段,那么这次划分的贡献为:

i=1k(max{Bi}min{Bi})

其中 max{Bi} 表示 Bi 这段中的最大值,min 同理。

计算所有划分方案的价值和对 998244353

n3×105,1ai109

fi 表示前 i 个元素构成的序列的所有划分方案的贡献和,则答案为 fn

一个显然的 O(n2) DP 是

fi=j=0i1fj×(maxj<kiakminj<kiak)

考虑把 maxmin 拆开,一个加一个减。

单独考虑 max 的贡献,每个 ak 可以影响的是一段区间,可以对这段区间的 f 用前缀和处理然后直接 O(1) 查询区间和。对于每个有贡献的 ak,直接用单调栈维护即可。min 的贡献同理。

时间复杂度 O(n)

ARC136E [dif:3100]

给你 n 个点,每个点有点权。如果两个点 i,j 满足 i<jgcd(i,j)>1 ,则有连边 ij。选择一些点,使他们之间不可达,点权和尽可能大。求这个最大点权和。

n106

1 可能能选。

剩下的,奇偶分类,偶数之间肯定有连边。对于奇数,设 f(x) 表示 x 的最小质因数。

最先和他联通的偶数是 xf(x)x+f(x)

如果一个奇数 y 和他联通,那么 x+f(x)yf(y)

那奇数位置有贡献的区间为 (xf(x),x+f(x))

偶数位置有贡献的区间为 [x,x]

在值域数组上差分统计,然后做个前缀和求最大值即可。

时间复杂度可以做到 O(n)

posted @   Suzt_ilymtics  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示