MMOI Round 2 题解
2026-07-07 09:47:06
发布于:河南
T1 追忆
显然当 时,需要 分钟才能将每一面都煎一遍;否则答案总是 。由于所有饼一共有 面,至少需要这么长时间才可能能煎完所有饼;又因为 ,按照 的顺序每次取 个饼煎一次不可能取到重复的饼,且恰好能在这么长时间内煎完所有饼,我们证明了这个结论。
T2 无限水
可以发现新的格子变成水源后水域的周长不会变大,因此需要放置的冰块数下界为 。下面给出一种能取到下界的构造:
- 若 不都是偶数,放第一行的 列和第一列的 行,若 是偶数,额外放 ;若 是偶数,额外放 。
- 若 都是偶数,放第一行的 列和最后一列的 行,以及左下角 。
容易证明这样的构造符合条件并且放置了恰好 个冰块。
T3 无处存储
在输入时求出所有数的异或和 ,以及所有二进制下第 位为 的数的异或和 。 中出现两次的数在 中会被抵消,所以 。
又因为 ,所以 。设 在二进制下的第 位为 ,则 在第 位分别为 ,只有一个数被计入 ,所以两个数分别为 和 ,按照大小顺序输出即可,空间复杂度 。
T4 攀登
使用并查集维护每个数所在的可重集,并对每个可重集维护包含可重集内所有大于 的数组成的链表 、值为 的数的个数 、值为 的数的个数 和可重集内所有数的和 。
合并两个可重集 时,将两个链表 合并得到新的 ,同时 ,,。
对一个可重集 进行操作时,很容易计算不在链表中的数的贡献,若 则 ,;若 则 ,。对于链表中的数,我们直接暴力枚举每个数进行修改,若修改后小于等于 则从链表中删除并计入对 的贡献。
不难发现一个数 在进行 次操作后就会变成 或 ,因此每个数只会被链表暴力枚举到 次,总时间复杂度 。
全部评论 55
罐头
2026-07-07 来自 北京
27何意味
2026-07-09 来自 浙江
14??
2026-07-11 来自 浙江
8罐头
2026-07-11 来自 上海
5
T3不赖,孩子爱吃
2026-07-07 来自 浙江
24T3不赖,孩子爱吃
2026-07-09 来自 浙江
11小馋猫
2026-07-09 来自 浙江
6:)
2026-07-12 来自 浙江
0
为什么官方解法没几个人看,最有意思的是T2。
2026-07-06 来自 重庆
14因为认真做的没几个
2026-07-07 来自 浙江
10因为没几个能认真做
2026-07-07 来自 浙江
10T2有原吧
2026-07-07 来自 广东
4
求赞



https://xmcdn.oss-cn-shanghai.aliyuncs.com/cpp_community/images/sticker/acgo/%E5%A4%A7%E4%BD%AC.png
https://xmcdn.oss-cn-shanghai.aliyuncs.com/cpp_community/images/sticker/acgo_gif/%E5%8A%A0%E6%B2%B9%E5%96%9D%E5%BD%A9.gif2026-07-08 来自 北京
5d
2026-07-08 来自 浙江
5
2026-07-10 来自 广东
3
2026-07-10 来自 广东
3
2026-07-10 来自 广东
3
2026-07-11 来自 浙江
0
d
2026-07-14 来自 陕西
1
2026-07-11 来自 广东
1d
2026-07-07 来自 陕西
1
2026-07-07 来自 浙江
1刷个罐头
2026-07-24 来自 浙江
02
2026-07-24 来自 北京
0a
2026-07-22 来自 河北
0s
2026-07-21 来自 浙江
0mc
2026-07-18 来自 浙江
02
2026-07-17 来自 湖南
01
2026-07-16 来自 广东
0yy
2026-07-16 来自 江苏
0[链接描述](#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){//cout<<pow(2,1000);1.26765e+30 for(int i=1;i<=11;i++){ for(int j=1;j<=24;j++){ if(j==12||(i==1&&j<=12)||(j==13)||(i==11&&j>=12)||(j==23&&i<=6)||i==6||(j==1&&i>=6)||(j==2&&i>=6)||(j==24&&i<=6))cout<<"|";else cout<<" "; } cout<<endl; } cout<<endl; return 0;}
)2026-07-14 来自 广东
0#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){//cout<<pow(2,1000);1.26765e+30 for(int i=1;i<=11;i++){ for(int j=1;j<=24;j++){ if(j==12||(i==1&&j<=12)||(j==13)||(i==11&&j>=12)||(j==23&&i<=6)||i==6||(j==1&&i>=6)||(j==2&&i>=6)||(j==24&&i<=6))cout<<"|";else cout<<" "; } cout<<endl; } cout<<endl; return 0;}
2026-07-14 来自 广东
0




























































有帮助,赞一个