用户工具

站点工具


2020-2021:teams:manespace:2020_07_18-2020_07_24周报_week11

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
2020-2021:teams:manespace:2020_07_18-2020_07_24周报_week11 [2020/07/24 14:37]
iuiou
2020-2021:teams:manespace:2020_07_18-2020_07_24周报_week11 [2020/07/31 10:33] (当前版本)
quantumbolt
行 1: 行 1:
-======2020/​07/​18–2020/​07/​24周报(week10)======+======2020/​07/​18–2020/​07/​24周报(week11)====== 
 + 
 +=====本周推荐===== 
 +====by iuiou==== 
 +  * **题源**:[[https://​codeforces.com/​contest/​1385/​problem/​G]] 
 + 
 +  * **题意**:给定两排数,每排都有$n$个数,每次操作可以交换一列的两个数,问能否存在一个最少的交换方案,使操作之后每一行都是$1$到$n$的一个排列。 
 +   
 +  ***知识点**:dfs 
 +  
 +  * **题解**:这题有点难想,大致是一个二分图的问题。首先遍历两行数,如果一个数的出现次数超过了2次,那么肯定不成立。如果所有数出现次数都是两次,那么一定有一种方案满足。现定四个数组$r1[n],​r2[n],​b1[n],​b2[n],​b$数组用于存放列数,$r$数组用于存放行数,如果对于一个数$i$,​$b_{1i}=b_{2i}$,​则不考虑这个点,因为肯定不会动这个点的。接下来对点染色,如果$b_{1i}≠b_{2i}$,​考虑$r$数组,如果$r_{1i}≠r_{2i}$,​则在$b_{1i}$和$b_{2i}$之间连一条权为0的边表示,两点染的色必须相同。反之,连一条权为$1$的边,表示两个点颜色相反,最后从每个点开始$dfs$经行染色即可,​注意每次比对将开头的那个点染成$1$还是$0$,最后的结果会最优(即最少)。 
 =====团队训练===== =====团队训练=====
 2020.7.18 [[牛客多校第三场]] 2020.7.18 [[牛客多校第三场]]
2020-2021/teams/manespace/2020_07_18-2020_07_24周报_week11.1595572663.txt.gz · 最后更改: 2020/07/24 14:37 由 iuiou