The solution to NOIP2024·T1——edit
The solution to NOIP2024·T1——edit
https://www.luogu.com.cn/problem/P11361
这是我在赛场想出来的思路,平时一个绿题都写不出来的题竟然一眼出思路,也真是RP++;
思路
由题目中的非限制的数可以互相交换,想到对于每一段连续的非限制性的区间都可以任意排布位置。那么可以把 t 序列中的所有 0 视作一个分割线,将整个序列分成若干个区间。我们统计出每个区间内 0 和 1 的个数,从左到右分类讨论,贪心地以优先相同的原则统计贡献(贡献当然是 1 啦)。
大致流程
1. 以 t 序列中的每个位置的 0 为断点,分割区间,并分别统计其中 0 、1 的个数。
2. 从左往右枚举位数,对于第 i 位有三种情况。
- 第一,\(s1_i\) 与 \(s2_i\) 均为固定位置,直接判断加入贡献即可;
- 第二,\(s1_i\) 与 \(s2_i\) 其中有一个固定,另一不固定,则判断其中不固定的那个位置所在的区间中是否有与另一个固定位置的数相同的数存在,若有,则计入贡献,将区间内次数的个数减一,若无,则不计入贡献,将区间内另一数的次数减一;
- 第三,若 \(s1_i\) 与 \(s2_i\) 均为不固定区间,则判断是否存在一个数同时出现在两个区间里,若 1 , 0 都有,则将其中任意的一个数个数减一,并记录贡献。而若不存在一个数同时出现在两个区间中,则将其分别减一,不记录贡献。可以证明,不可能出现两个区间有一个数次数为零的情况。
最后,调试代码、过大样例。 &半场开香槟。
正确性简单证明
考虑如果你当前位减少 1 的贡献让他不匹配,后面最多也只能增加 1 的贡献,所以能匹配就匹配是一定不劣的。
代码
等选手代码下来再补上。
后记
主播蒟蒻本来打算退役的,却一不小心考好了,看来退役不了了, 粉碎了我的退役梦……
By yinxilin (JX のjoker)
2024年11月30日