杂题乱做
AGC054C
考虑对于 \(P\) 如何求出最小交换次数。令 \(P_{pos_i}=i\)。
容易想到一个贪心策略:依次考虑 \(1,2...n\),如果当前 \(pos_i\) 前面比 \(i\) 大的数不超过 \(k\) 就不管,否则暴力往左边调整直到前面比 \(i\) 大的数不超过 \(k\)为止。
最优性:这个比较显然,因为我们每次选最小的一个数调整,如果先调整大的肯定不会更优。
正确性:这不更显然吗,显然后面调整的数不会把已经调好的数往右边挤,所以正确性显然。
然后我就开始各种数数,发现数 \(pos\) 数不出来,数其它的也数不出来,但就是没想到直接数 \(x_i\)(菜是原罪)。
设 \(x_i\) 表示排列 \(P\) 在 \([1,pos_i)\) 内比 \(i\) 大的数的个数,\(x^{\prime}_i\) 表示 \(P^{\prime}\) 的。那么有 \(x^{\prime}_i=\min(x_i,k)\)。
\(x^{\prime}\) 是可以直接求的。如果 \(x^{\prime}_i<k\),显然 \(x_i\) 唯一确定。否则,\(k\le x_i\le n-i\)。
显然可以归纳法证明每个 \(x\) 唯一对应一个排列 \(P\)显然确实显然但我就是注意不到。于是答案即为 \(\prod\limits_{cnt_i=k}(n-i-k+1)\)。
这种数排列的题 agc 貌似还挺喜欢出的,agc056b 和这场比赛的A也是。基本上这种题目都需要先分析一堆性质和结论,然后找到一个对应且唯一对应一个排列的东西,并且要求这个东西是好数的,最后把这个东西数出来就好了。
AGC052B
人类智慧题,完全不会。
考虑一次操作的本质,如果我们求出了以 1 为根每个节点到根路径上所有边权异或和 \(a_i\),则一条边边权等于端点点权异或,一次操作相当于交换点权(人类智慧)。
因此先求出分别以 \(w_1,w_2\) 为边权每个节点到根路径上所有边权异或和,分别记作 \(a_i,b_i\)
那么我们的任务就是把 \(a,b\) 配对。看起来排个序就没了对吧。
然而发现当操作与根相连的边的时候非常麻烦,并不是简单地交换点权。
所以考虑新建一个点(人类智慧*2)连向 1。边权是多少呢?
假设最后把 \(a_x,b_y\) 配对,那么要求 \(a_x\oplus val = b_y\)。\(n\) 是奇数,因此得到 \(val\) 就是所有 \(a,b\) 的异或和。
然后把所有 \(a_i\) 异或上 \(val\) 再排序就好了。
一个小trick:在这种单次操作非常阴间,甚至是令人不知所云的题目中,可以尝试构造一个新数组,把转化修改操作简单地转化到这个新数组上。这个新数组的构造优先考虑前缀和与差分数组。
特别是在这种有意考察这个 trick 的题目(比如这题)中,原来的修改操作往往会显得非常奇怪并且让人不知道为什么要把修改设置得这么奇怪。
这个转化成点权交换不是和 NOIP2021T3 一模一样吗,下次遇到这种题不能再踩坑了
JOISC2015 Day4T1
考虑对于这 \(k\) 个操作同时执行,按照 kruskal 的流程,当前边 \(u,v\) 应该分配在编号最小的 \(u,v\) 目前还不在一个并查集内的那个操作。二分出这个并查集即可。
这傻逼题我想了2min不会是不是可以退役了啊