20241118【NOIP】模拟

比真实NOIP的难度简单多了,但还是挂惨了

为什么没想到T2怎么做呢

T1

打表后容易发现答案形如 9 7 5 3 1 2 4 6 88 6 4 2 1 3 5 7

T2

边数是 \(O(n^2)\) 级的,太多了,发现数据支持 \(O(nq)\) 的做法,于是考虑怎么减少边数到 \(O(n)\) 级。每次查询相当于是增加了一条边,可以想不到离线下来,先求出初始的最小生成树的边,然后把增加的边加进去,每次询问直接跑kruskal,在过程中判断这条边在时间上是否能选择就完了,边数是 \(n-1+q\)。很简单的,但是傻逼出题人卡常,所以第一遍边数 \(O(n^2)\) 的时候要用prim。

T3

第一问贪心一下,把两个序列排序然后同一位置上的数对应起来就是答案。记录原序列中 \(B\)\(A_i\) 配对的位置,也是贪心的想,如果遇到一个位置当前匹配的不是它应该匹配的数,那么就一直swap,直到正确匹配,正确性感性理解。

点击查看代码
for(int i=1;i<=n;++i) a[A[i].id].pa=B[i].id;
for(int i=1;i<=n;++i)
	while(a[i].pa!=i) swap(a[i],a[a[i].pa]),++ans2;
cout<<" "<<ans2;

T4

题都读不懂,傻逼出题人题意写得批烂还不给样例解释,玩你吗

posted @ 2024-11-18 16:47  和蜀玩  阅读(43)  评论(1)    收藏  举报