ABC217

ABC217

A#

签到

B#

签到

C#

签到

D#

有一根长度为L的木棍,有以下两个操作:

1.xi处断开

2.回答包含xi处的木棍的长度

解:

set二分

E#

给定一个空序列,有以下三种操作:

1.在末尾添加一个字符x

2.输出首字符并删除

3.将序列升序排序

解:

queue维护序列,升序排序时将序列中的所有字符都加入小根堆

输出时优先输出小根堆内堆顶,堆为空时输出队首

F#

一列2n(n200)个人,有m对友好关系,每次选择相邻的两个友好的人删掉,求删掉所有人的方案数

解:

一眼区间dp

但是计算方案数的区间dp需要特殊的统计方法保证不重不漏

要不重复就要利用当前枚举到区间的特征

枚举k[l+1,r],表示最后一步是由l,k配对而成

f[l][r]=k=l+1rf[l+1][k1]f[k+1][r](rl+12kl+12)

G#

1n(n5000)分配到k(k=1,2,,n)个非空集合里,id号模m同余的人不能在一个集合里,有多少种分组方式?

解:

考虑没有限制时,答案为第二类斯特林数S2[n][k]

第二类斯特林数的递推式

dp[i][j]=dp[i1][j1]+dp[i1][j]j

其中第一部分表示第i个数字自成一组,不需要考虑限制

第二个部分表示第i个数字加入到现有的组中,只要去掉不能加入的组

sum[i]1i1中模mi同余的数的个数

dp[i][j]=dp[i1][j1]+dp[i][j](jsum[i])

H#

小人开始时在数轴上的原点,每个时刻可以选择向左移动一步或向右移动一步

n(2e5)次操作,每次在ti时刻xi处出现出现一把向左或向右发射的水枪,对小人造成|xipos|的伤害,如果在水枪背侧则不受伤害

求受到的最少伤害

解:

https://www.cnblogs.com/ak-dream/p/AK_DREAM127.html

这篇写得好

定义一个dp状态:dpt,x表示t时刻在x处受到的最少伤害,Ft,x表示t时刻在x处受到的伤害

有转移方程

dpti,x=F(t,x)+min{dp[ti1][y],y[xΔt,x+Δt]}

然后我们需要敏锐地观察力和经验发现,对于固定的ti(x,dpt,x)构成了一个下凸函数

那么可以发现对于凸壳左半侧,dpti,x=dpti1,x+Δt

对于右半侧dpti,x=dpti+1,xΔt

等于将左半侧凸壳向右移动Δt,右半侧凸壳向左移动Δt

第二部分F(t,x),以向左发射为例,对于小于xi的部分是一个斜率为1的一次函数,对于大于xi的部分是贡献为0的常函数

现在介绍维护凸壳,每次只会对凸壳某一部分的斜率改变一个单位,且相邻两部分之间斜率相差1,因为只要维护凸壳的断点在哪里

将左侧和右侧分开维护,并手动统计斜率为0的部分的答案

后面细节看上面博客

posted @   lovelyred  阅读(53)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
CONTENTS