1339. Babies
Time limit: 1.0 second
Memory limit: 64 MB
O tempora! O mores!
Present-day babies progress quickly. There are exactly k boys and k girls in the kindergarten. Some boys like some girls. But in this age the boys are still knights, so, if some boy like some girl then he likes the only girl and moreover one and the same girl can’t be liked by more than one boy. And the girls in this age are true ladies. So, if a girl likes a boy she likes the only one, and different girls like different boys.
The children are ingenuous. Their secret amorousness is well-known to the nurse. Once the group decided to go for a walk and the nurse made up her mind to fall the children in pairs so that if there is a boy or a girl in love in a pair then the boy likes his pair-mate or the girl likes the boy. Help the nurse to arrange the described pairs. You may assume that either the boys or the girls enumerated with positive integers from 1 to k.
Input
The first line contains the integer k — the number of boys (1 ≤ k ≤ 250 000). The second line consists of the numbers of girls that are liked by boys: if the i‘th boy likes some girls, her number is at the i‘th position; if the i‘th boy likes nobody, there is 0 at the i‘th position. The numbers are separated with a space. The third line consists of the analogous information about the girls.
Output
You should output the sequence of k integers. The i‘th element of the sequence is the number of a girl that is a pair-mate of the i‘th boy. The numbers are separated with a space.
Sample
input | output |
---|---|
3 3 0 0 0 2 0 |
3 2 1 |
Problem Author: Magaz Asanov
Problem Source: USU Championship 2004
Tags: graph theory (hide tags for unsolved problems)
Difficulty: 966
题意:有n个男孩女孩,每个男孩只有至多一个喜欢的女孩,每个女孩只有至多一个喜欢的男孩。男孩喜欢的女孩互不相同,女孩喜欢的男孩互不相同。
求一个配对方案使得每一对人要么至少其中一个人喜欢对方,或两个人都没有喜欢的人。
分析:
发现这是一个每个点都只有一个出度、入度的图。
如果是环的话就随便连就好,题目保证不会有奇怪的情况。
如果不是环,就从没有人喜欢的那个人开始连。
注意奇链。
这又是ural上难度虚高的题目。
1 /** 2 Create By yzx - stupidboy 3 */ 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cmath> 8 #include <deque> 9 #include <vector> 10 #include <queue> 11 #include <iostream> 12 #include <algorithm> 13 #include <map> 14 #include <set> 15 #include <ctime> 16 #include <iomanip> 17 using namespace std; 18 typedef long long LL; 19 typedef double DB; 20 #define For(i, s, t) for(int i = (s); i <= (t); i++) 21 #define Ford(i, s, t) for(int i = (s); i >= (t); i--) 22 #define Rep(i, t) for(int i = (0); i < (t); i++) 23 #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--) 24 #define rep(i, x, t) for(int i = (x); i < (t); i++) 25 #define MIT (2147483647) 26 #define INF (1000000001) 27 #define MLL (1000000000000000001LL) 28 #define sz(x) ((int) (x).size()) 29 #define clr(x, y) memset(x, y, sizeof(x)) 30 #define puf push_front 31 #define pub push_back 32 #define pof pop_front 33 #define pob pop_back 34 #define ft first 35 #define sd second 36 #define mk make_pair 37 inline void SetIO(string Name) 38 { 39 string Input = Name+".in", 40 Output = Name+".out"; 41 freopen(Input.c_str(), "r", stdin), 42 freopen(Output.c_str(), "w", stdout); 43 } 44 45 46 inline int Getint() 47 { 48 int Ret = 0; 49 char Ch = ‘ ‘; 50 bool Flag = 0; 51 while(!(Ch >= ‘0‘ && Ch <= ‘9‘)) 52 { 53 if(Ch == ‘-‘) Flag ^= 1; 54 Ch = getchar(); 55 } 56 while(Ch >= ‘0‘ && Ch <= ‘9‘) 57 { 58 Ret = Ret * 10 + Ch - ‘0‘; 59 Ch = getchar(); 60 } 61 return Flag ? -Ret : Ret; 62 } 63 64 const int N = 250010; 65 int n, Boy[N], Girl[N]; 66 int Fa[N * 2], Next[N * 2]; 67 int Ans[N * 2]; 68 69 inline void Input() 70 { 71 scanf("%d", &n); 72 For(i, 1, n) scanf("%d", &Boy[i]); 73 For(i, 1, n) scanf("%d", &Girl[i]); 74 } 75 76 inline void Solve() 77 { 78 For(i, 1, n) 79 { 80 if(Boy[i]) 81 { 82 Next[i] = Boy[i] + n; 83 Fa[Boy[i] + n] = i; 84 } 85 if(Girl[i]) 86 { 87 Next[i + n] = Girl[i]; 88 Fa[Girl[i]] = i + n; 89 } 90 } 91 92 For(i, 1, 2 * n) 93 if(!Fa[i]) 94 { 95 int x = i; 96 while(Next[x] && !Ans[x]) 97 { 98 Ans[x] = Next[x]; 99 Ans[Next[x]] = x; 100 x = Next[x]; 101 x = Next[x]; 102 } 103 } 104 105 For(i, 1, 2 * n) 106 if(!Ans[i]) 107 { 108 int x = i; 109 while(Next[x] && !Ans[x] && !Ans[Next[x]]) 110 { 111 Ans[x] = Next[x]; 112 Ans[Next[x]] = x; 113 x = Next[x]; 114 x = Next[x]; 115 } 116 } 117 118 int x = n + 1; 119 For(i, 1, n) 120 if(!Ans[i]) 121 { 122 while(Ans[x]) x++; 123 Ans[i] = x; 124 Ans[x] = i; 125 } 126 127 For(i, 1, n - 1) printf("%d ", Ans[i] - n); 128 printf("%d\n", Ans[n] - n); 129 } 130 131 int main() 132 { 133 #ifndef ONLINE_JUDGE 134 SetIO("B"); 135 #endif 136 Input(); 137 Solve(); 138 return 0; 139 }