AtCoder Regular Contest 068~072

C D E F
ARC068 + +
ARC069 + +
ARC070 +
ARC071 + + + +
ARC072 + + +1 +
+:赛时通过 +:赛后通过 +:未知 -:嘴巴

AtCoder Regular Contest 068

E. Snuke Line

考虑最难办的事情其实就是每个车站内自己的去重。可以发现,对于 d 的列车,如果某个区间长度 d,那么其必然会被经过,否则其至多被经过一次。

所以直接处理按从小到大顺序枚举 d,对于长度大于当前 d 的区间不用加入,复杂度 O(nlogn)

提交记录

F. Solitaire

考虑加入存在完成后整个序列一定是 \/ 形状的,考虑要让 1 出现在第 k 个位置,那么还会剩下 nk1 个,可以发现无论如何剩下的一定是一段递增或是递减的序列。且其中的最大值小于同向部分弹出的最小值。

fi,j 表示 前 k1 个数中,已确定了 i 个数,最小值为 j

考虑新加的数,有转移式 fi,jfi+1,j , fi+1,kj

后者直接后缀和处理,复杂度 O(n2)

#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

考虑策略显然是用一条线从上往下压,同时压到的部分从后往前删。

直接维护此时最小的位置与要删的数量即可。复杂度 O(nlogn)

提交记录

F. Flags

考虑二分答案,这样相当于若干条“选了 x 就不能选 y”,直接跑不太行,直接线段树优化建图跑 2-sat 即可。

复杂度 O(nlog2n)

提交记录

AtCoder Regular Contest 070

E. NarrowRectangles

容易发现若干 |xai| 构成的函数一定是凸的,考虑大力维护这个凸函数。

考虑用小根堆维护最小值右边的函数,大根堆维护左边,分别维护断点。

考虑每次加入一个元素后的影响:相当于在最优位置插入了一条斜率为 0 的线段,然后比 r 小的 +1,比 r 大的 1

考虑每次至多 +1,所以至多把每个堆的一个元素扔到另一个堆里,所以复杂度是对的。

复杂度 O(nlogn)

提交记录

AtCoder Regular Contest 071

E. TrBBnsformBBtion

首先直接把所有 B 变成 A 再消掉,一定可以得到 2A

然后同样从 2A 一定可以变成任何串。

所以令 A=1,B=2,两个串可以互相转化当且仅当两个串的和模 3 相等。

提交记录

F. Infinite Sequence

考虑如果有超过两个非 1 的位置,后面一定全部相等。

如果第一个填的是 k,k>1,并且后面不全相等,那么后面 k 个必须是 1

所以枚举第一个填什么,可以列出 dp 式子:

fi=fi+1+(n1)2+k2fi+k+1

直接后缀和一下即可。复杂度 O(n)

提交记录

AtCoder Regular Contest 072

D. Alice&Brown

打个表发现答案是 |XY|1。考虑证明:

  • 首先 (0,0),(1,1),(0,1),(1,0) 显然先手必败。
  • 对于 |XY|>1 不妨假设 X>Y,这样从 X 中取 XY3 就会变成 |XY|1
  • 对于 |XY|1 显然不存在构造。

E. Alice in linear land

设修改的位置是 p。首先 1p 部分处理的结果是固定的,对于修改来说,显然此时距离原点越远越好。

从后往前我们尝试构造 fi 表示从 i 开始最小的距离满足不能到达。容易发现如果我们知道了 fi+1,对于 ai 我们只要考虑会不会影响到达,如果不会就直接取上一个值,否则我们构造 fi+1+ai

最后只要判断这两个值哪个大即可。

提交记录

F. Dam

首先显然只要让总热量最大,除以 L 就是答案。

fi(x) 表示第 i 次加水后,剩余水量为 x 的最大热量,容易发现此时不断放水就可以取到原点线段上的点,所以这个函数一定是上凸的。

尝试维护这个凸包。可以发现当冲入 (x,y) 的水后,等同于在前面加上了 (x,y) 这个向量。如果此时队首向量斜率大于当前向量,换句话说我们不会主动放掉队首对应的水,那么就直接混合这两部分即可。

最后我们只需要截取 f(L) 即可,可以发现超过 L 的可以直接扔掉,所以用一个双端队列即可。

复杂度 O(n)

提交记录

posted @   Flying2018  阅读(56)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 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编程运行原理
点击右上角即可分享
微信分享提示