NOIP2024模拟赛9 赛后总结
前言
听说把枕头哭湿,晚上可以梦见大海
先说明一下情况。
我
我们都有光明的未来。
我尽量克制住自己的情绪。
B / ABC176F
很智慧的一道题,稍微总结一下。
首先你显然有
暴力转移其实是比较简单的,假设这一次操作除了
-
把
删掉, 。 -
把
中的两个和 中的一个删掉,不妨设我们删的是 , 。 -
把
中的一个和 删掉,不妨设我们删的是 , 。
观察到第一种转移可以看作是全局加
至于后面两个,观察到变化的状态只有
故你考虑把所有变化状态暴力取出来,然后维护一些最大值数组即可。
由于你每次只改变了那些会改变的,故总复杂度
很难崩的是,这个题你一旦常数大了一点你就会喜提
C / CF407D
题解非常清晰明了,这里懒得讲了,讲一下自己的巨恶心做法。
为了将这个做法优化到
说实话这个做法真的挺难有语言描述的。
首先你考虑维护一个
接着维护一个
有了
有了这三个数组之后,答案应该是非常好维护的。
我们考虑枚举这个长方形的的最上面一行,假设是第
答案应该是
感觉还是比较好理解的。至于里面的那一坨
里面唯一的难点在于
观察到
如下:
for (int len = 1; len <= m; ++len)
{
for (int l = 1, r = len; r <= m; ++l, ++r)
{
for (int k = n; k >= 1; --k)
{
if(r != l) num[k][l][r] = min(num[k][l + 1][r], num[k][l][r - 1]);
num[k][l][r] = min(num[k][l][r], min(bucket[a[k][l]], bucket[a[k][r]]));
bucket[a[k][l]] = min(bucket[a[k][l]], (short)k);
bucket[a[k][r]] = min(bucket[a[k][r]], (short)k);
}
for (int k = 1; k <= n; ++k) bucket[a[k][l]] = bucket[a[k][r]] = 0x3f3f;
// for (int i = 1; i <= n; ++i) cout << i << " " << l << " " << r << " " << num[i][l][r] << endl;
}
}
其实还有一堆细节,可以考虑直接看代码。
人傻常数大啊啊啊啊,每次都是这种恶心的做法,还要被卡常,难崩。
D / ARC118E
感觉考试的时候思考方向完全不对,以及第一篇这个形式化题解其实讲的挺清楚的。
我们定义
题目即求
在此基础上我们考虑一个容斥。
答案就会变成
观察到这个一点也不好求,于是我们考虑换一下位置:
还可以把最后一个循环去掉:
这个时候应该比较好
故我们定义
转移可以直接见代码,最后直接乘上容斥系数即可,重点要了解的是这个容斥是怎么来的。
后记
因为被我们强大的绍兴一中搞破防了,所以很水。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】