「比赛题解」AtCoder Regular Contest 126

「比赛题解」AtCoder Regular Contest 126

比赛链接

开了把vp,C降智导致浪费大量时间/dk/dk

A

贪心,几种凑 10 的方案的优先度是:(3,3,4),(3,3,2,2),(4,4,2),(2,2,2,2,2),(4,2,2,2)

ll a, b, c, ans;
void solve() {
	read(a); read(b); read(c);
	ll sum = 0;
	ll t1 = Min(b/2, c+a/2);
	sum = t1;
	if(t1 > c) t1 -= c, c = 0, a -= 2 * t1;
	else c -= t1;
	ll t2 = Min(c/2, a);
	a -= t2;
	printf("%lld\n", sum + t2 + a/5 + (a % 5 >= 3 && c % 2 == 1));
}

B

fi([i,n],1) 一条线段也没挂的最大挂绳子数。

按顺序枚举每一个绳子,然后用线段树快速转移这个 dp 即可。

Code

C

k 能够把所有的 A 都添到 maxA 的情况特判掉,这样答案只可能 maxA

开个桶,用前缀和维护值域上的 A 的个数,A 的和,枚举每一个可能的答案 x,然后枚举 x 的倍数,可以快速统计所需的最小代价。复杂度是调和级数的。

Code

D

状压dp + 费用提前计算。

从前往后枚举 i,设 fS 为考虑集合 S 已经连在一起且排好序的代价,并且包括提前计算的费用,这里提前计算的费用是使得有一个数想加进来的时候之间按照插排的规则插入进来,走到这个段之前的代价已经在 f 里面算进去了。

这个提前计算的费用为多少?对于一个位置 i 如果不是最终的递增段,而是一个路人,那么递增段要经过它并且凑齐的最小代价是递增段在它左边多少和在它右边多少取个 min,也就是 min(pop_count(S),kpop_count(S))

形象地:

o...o...o..Δ..o...o...o..o

假如 Δ 是当前枚举到的 i,而 o 是最终要拼成连续段的位置,那么要不然左边所有的 o 越过 Δ,要不然右边所有的 o 越过 Δ,那么 Δ 处需要提前计算的费用就是两边 o 的个数取 min

Code

E

感性理解一下,limnf(n)=12i<j|AiAj|,严谨的证明在这里

离散化一下,在值域上开个线段树,维护值域区间有几个 A,以及它们的和是多少,就能维护答案了。

F

不会。

posted @   do_while_true  阅读(122)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

This blog has running: 1845 days 1 hours 34 minutes 4 seconds

点击右上角即可分享
微信分享提示