codeforces#1139E. Maximize Mex(逆处理,二分匹配)

题目链接:

http://codeforces.com/contest/1139/problem/E

题意:

数据范围:

分析:

ac代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5e3+10;;
 4 int match[maxn],vis[maxn],ans[maxn],p[maxn],c[maxn],k[maxn],d,n,m;
 5 int ma[maxn][maxn],book[maxn],f[maxn],to[maxn],cnt,nex[maxn];
 6 void add(int a,int b)
 7 {
 8     cnt++;
 9     to[cnt]=b;
10     nex[cnt]=f[a];
11     f[a]=cnt;
12 }
13 bool dfs(int x)
14 {
15     if(vis[x])return false;
16     vis[x]=1;
17     for(int i=f[x]; i; i=nex[i])
18     {
19         int v=to[i];
20             if(match[v]==-1||dfs(match[v]))
21             {
22                 match[v]=x;
23                 return true;
24             }
25     }
26     return false;
27 }
28 int main()
29 {
30     scanf("%d %d",&n,&m);
31     for(int i=0; i<maxn; i++)match[i]=-1;
32     for(int i=1; i<=n; i++)
33         scanf("%d",&p[i]);
34     for(int i=1; i<=n; i++)
35         scanf("%d",&c[i]);
36     scanf("%d",&d);
37     for(int i=1; i<=d; i++)
38     {
39         scanf("%d",&k[i]);
40         book[k[i]]=1;
41     }
42     for(int i=1; i<=n; i++)
43         if(book[i]==0)add(p[i],c[i]);
44 
45     for(int i=d; i>=1; i--)
46     {
47         ans[i]=ans[i+1];
48         while(1)
49         {
50             memset(vis,0,sizeof(vis));
51             if(dfs(ans[i]))ans[i]++;
52             else break;
53         }
54         int x=k[i];
55         add(p[x],c[x]);
56     }
57     for(int i=1; i<=d; i++)
58         printf("%d\n",ans[i]);
59     return 0;
60 }

猜你喜欢

转载自www.cnblogs.com/carcar/p/10729182.html
今日推荐