NOIP2023 T1 T2 题解

\(P9868\)

\(1\) 输出你喜欢的\(1\)骗分,期望得分\(10pts\)

\(2\)~\(4\) 找到最小的字母,若出现\(1\)次,那只有它对应的答案为\(1\),否则全为\(0\),期望得分\(40pts\)

\(5\)~\(7\) 暴力枚举所有\(2^n\)种情况,然后按\(2\) ~ \(4\)去做就可以了,复杂度\(O(2^nn)\),期望得分\(70pts\)

\(8\) 显然让\(i\)从小到大排成\(s_i\),让\(j\)从大到小排成\(t_j\)是最好的,于是暴力枚举\(i\)\(j\),暴力比较\(s_i\)\(t_j\)即可,复杂度\(O(n^2m)\),期望得分\(80pts\)

\(9\)~\(10\) 其实根本不需要枚举\(j\)。求出\(t\)中最小的\(minn\)和次小的\(sminn\)。对于\(i\),若\(t_i==minn\),那就拿\(s_i\)\(sminn\)比较,否则就和\(minn\)比较,复杂度\(O(nm)\),期望得分\(100pts\)

\(P9869\)

\(1\)~\(2\) 写你喜欢的暴力,复杂度\(O(3^n(n+m))\),期望得分\(20pts\)

\(3\)~\(4\) 看最后有多少个位置被改成\(U\)即可,期望得分\(40pts\)

\(5\)~\(6\) 好开始解说。
我们可以维护一个\(pos_i\)代表\(i\)最后的值是什么,是\(1-n\)中谁的初值,还是\(U\)。然后,用并查集维护以\((i,pos_i)\)为边的图的连通性。若一个联通块中含有\(pos\)\(U\)的元素,那整个联通块都要为\(U\),复杂度\(O(n+m)\),期望得分\(60pts\)

\(7\)~\(8\) \(pos_i\)就要变成矢量了。\(-x\)代表\(x\)初值的相反值。边要变成\((i,pos_i)\)\((-i,-pos_i)\)了。然后,如果对于\(i\)\(i\)\(-i\)在一个联通块内,那\(i\)就要是\(U\),那整个联通块都要是\(U\)。复杂度\(O(n+m)\),期望得分\(80pts\)

\(9\)~\(10\) 特殊性质的提示性很强,把上面两个条件结合一下就行了。\(T\)\(F\)不用管,无视即可。复杂度\(O(n+m)\),期望得分\(100pts\)

\(n\le 10^3\)就让人无法理解了,难道考\(NOIP\)的人还有不会并查集的吗?

还有一种做法是,对\((i,abs(pos_i))\)建有向边。若\(abs>0\),边权就为\(1\),否则为\(0\)。这样建出来的就是基环树森林。有以\(T/F/U\)为根的树,还有以环为根的树。\(T/F\)显然不用管。以\(U\)为根的,整个树都要为\(U\)。以边权和为\(1\)的环为根的,整个树都要为\(U\)。这种做法比并查集要难写一些,但是相对清晰和明了。而且可以看出,这道题\(100\)%有解。

最后来一句,相信\(NOIP\),能力到了,就一定能考出来!

posted @ 2025-08-18 18:06  captainOI  阅读(27)  评论(0)    收藏  举报