AtCoder Regular Contest 068~072
C | D | E | F | |
---|---|---|---|---|
ARC068 | ||||
ARC069 | ||||
ARC070 | ||||
ARC071 | ||||
ARC072 | ||||
:赛时通过 | :赛后通过 | :未知 | :嘴巴 |
AtCoder Regular Contest 068
E. Snuke Line
考虑最难办的事情其实就是每个车站内自己的去重。可以发现,对于 的列车,如果某个区间长度 ,那么其必然会被经过,否则其至多被经过一次。
所以直接处理按从小到大顺序枚举 ,对于长度大于当前 的区间不用加入,复杂度 。
提交记录
F. Solitaire
考虑加入存在完成后整个序列一定是 形状的,考虑要让 出现在第 个位置,那么还会剩下 个,可以发现无论如何剩下的一定是一段递增或是递减的序列。且其中的最大值小于同向部分弹出的最小值。
用 表示 前 个数中,已确定了 个数,最小值为 。
考虑新加的数,有转移式 。
后者直接后缀和处理,复杂度 。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define ll long long
#define mod 1000000007
#define N 4010
using namespace std;
ll f[N][N],g[N][N];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
g[n+1][0]=1;
ll res=1;
for(int i=1;i<=n-k-1;i++) res=res*2%mod;
for(int i=n;i>=1;i--)
{
for(int j=0;j<=n;j++)
{
(g[i][j+1]+=f[i+1][j]+g[i+1][j])%=mod;
(f[i][j]+=f[i+1][j]+g[i+1][j])%=mod;
}
if(i!=1) for(int j=n;j>=0;j--) (f[i][j]+=f[i][j+1])%=mod;
}
printf("%lld\n",f[1][n-k]*res%mod);
return 0;
}
AtCoder Regular Contest 069
E. Frequency
考虑策略显然是用一条线从上往下压,同时压到的部分从后往前删。
直接维护此时最小的位置与要删的数量即可。复杂度 。
提交记录
F. Flags
考虑二分答案,这样相当于若干条“选了 就不能选 ”,直接跑不太行,直接线段树优化建图跑 2-sat 即可。
复杂度 。
提交记录
AtCoder Regular Contest 070
E. NarrowRectangles
容易发现若干 构成的函数一定是凸的,考虑大力维护这个凸函数。
考虑用小根堆维护最小值右边的函数,大根堆维护左边,分别维护断点。
考虑每次加入一个元素后的影响:相当于在最优位置插入了一条斜率为 的线段,然后比 小的 ,比 大的 。
考虑每次至多 ,所以至多把每个堆的一个元素扔到另一个堆里,所以复杂度是对的。
复杂度 。
提交记录
AtCoder Regular Contest 071
E. TrBBnsformBBtion
首先直接把所有 变成 再消掉,一定可以得到 个 。
然后同样从 个 一定可以变成任何串。
所以令 ,两个串可以互相转化当且仅当两个串的和模 相等。
提交记录
F. Infinite Sequence
考虑如果有超过两个非 的位置,后面一定全部相等。
如果第一个填的是 ,并且后面不全相等,那么后面 个必须是 。
所以枚举第一个填什么,可以列出 dp 式子:
直接后缀和一下即可。复杂度 。
提交记录
AtCoder Regular Contest 072
D. Alice&Brown
打个表发现答案是 。考虑证明:
- 首先 显然先手必败。
- 对于 不妨假设 ,这样从 中取 就会变成 。
- 对于 显然不存在构造。
E. Alice in linear land
设修改的位置是 。首先 部分处理的结果是固定的,对于修改来说,显然此时距离原点越远越好。
从后往前我们尝试构造 表示从 开始最小的距离满足不能到达。容易发现如果我们知道了 ,对于 我们只要考虑会不会影响到达,如果不会就直接取上一个值,否则我们构造 。
最后只要判断这两个值哪个大即可。
提交记录
F. Dam
首先显然只要让总热量最大,除以 就是答案。
设 表示第 次加水后,剩余水量为 的最大热量,容易发现此时不断放水就可以取到原点线段上的点,所以这个函数一定是上凸的。
尝试维护这个凸包。可以发现当冲入 的水后,等同于在前面加上了 这个向量。如果此时队首向量斜率大于当前向量,换句话说我们不会主动放掉队首对应的水,那么就直接混合这两部分即可。
最后我们只需要截取 即可,可以发现超过 的可以直接扔掉,所以用一个双端队列即可。
复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理