#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=1e5;
const int M=1e6;
const int K=50;
vector<int> e[2*N+10];
int mtch[2*N+10];
long long ans[K+10];
int r[K+10];
bool vis[2*N+10];
bool dfs(int x)
{
vis[x]=true;
for(auto v:e[x])
{
//cerr<<x<<": "<<v<<" "<<mtch[v]<<"\n";
if(mtch[v]==-1)
{
mtch[v]=x;
mtch[x]=v;
return true;
}
}
for(auto v:e[x])
{
//cerr<<x<<": "<<v<<" "<<mtch[v]<<"\n";
if(!vis[mtch[v]] && dfs(mtch[v]))
{
mtch[v]=x;
mtch[x]=v;
return true;
}
}
return false;
}
bool check(int x,int n,int ll,int rr)
{
if(!e[x].empty() && e[x].back()==n+x)
e[x].pop_back();
if(mtch[n+x]!=0 && mtch[n+x]!=-1)
{
mtch[mtch[n+x]]=-1;
mtch[n+x]=0;
}
for(int i=1;i<=n;i++)
vis[i]=false;
for(int i=n;i>=1;i--)
{
if(!vis[i] && mtch[i]==-1 && dfs(i))
return true;
}
return false;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vis[0]=true;
mtch[0]=0;
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
e[b].push_back(n+a);
}
for(int i=1;i<=k;i++)
r[i]=k+i;
for(int l=k+1;l<=n;l++)
{
for(int i=1;i<=k;i++)
mtch[n+i]=mtch[i]=-1;
for(int i=k+1;i<=n;i++)
{
mtch[n+i]=i;
mtch[i]=n+i;
if(e[i].empty() || e[i].back()!=n+i)
e[i].push_back(n+i);
}
r[0]=l;
for(int i=1;i<=k;i++)
{
r[i]=max(r[i],r[i-1]);
for(int j=r[i-1];j<min(n+1,r[i]);j++)
{
if(mtch[n+j]!=0 && mtch[n+j]!=-1)
{
mtch[mtch[n+j]]=-1;
mtch[n+j]=0;
}
if(!e[j].empty() && e[j].back()==n+j)
e[j].pop_back();
}
//cerr<<i<<" "<<l<<" "<<r[i]<<"\n";
while(r[i]<=n && !check(r[i],n,l,r[i]))
r[i]++;
r[i]=min(n+1,r[i]);
ans[i-1]+=r[i]-r[i-1];
//cerr<<i<<" ["<<l<<","<<r[i]<<"]\n\n";
}
ans[k]+=n+1-r[k];
}
for(int i=0;i<=k;i++)
cout<<ans[i]<<"\n";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include<bits/stdc++.h> #define fi first #define se second using namespace std; const int N=1e5; const int M=1e6; const int K=50; vector<int> e[2*N+10]; int mtch[2*N+10]; long long ans[K+10]; int r[K+10]; bool vis[2*N+10]; bool dfs(int x) { vis[x]=true; for(auto v:e[x]) { //cerr<<x<<": "<<v<<" "<<mtch[v]<<"\n"; if(mtch[v]==-1) { mtch[v]=x; mtch[x]=v; return true; } } for(auto v:e[x]) { //cerr<<x<<": "<<v<<" "<<mtch[v]<<"\n"; if(!vis[mtch[v]] && dfs(mtch[v])) { mtch[v]=x; mtch[x]=v; return true; } } return false; } bool check(int x,int n,int ll,int rr) { if(!e[x].empty() && e[x].back()==n+x) e[x].pop_back(); if(mtch[n+x]!=0 && mtch[n+x]!=-1) { mtch[mtch[n+x]]=-1; mtch[n+x]=0; } for(int i=1;i<=n;i++) vis[i]=false; for(int i=n;i>=1;i--) { if(!vis[i] && mtch[i]==-1 && dfs(i)) return true; } return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); vis[0]=true; mtch[0]=0; int n,m,k; cin>>n>>m>>k; for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; e[b].push_back(n+a); } for(int i=1;i<=k;i++) r[i]=k+i; for(int l=k+1;l<=n;l++) { for(int i=1;i<=k;i++) mtch[n+i]=mtch[i]=-1; for(int i=k+1;i<=n;i++) { mtch[n+i]=i; mtch[i]=n+i; if(e[i].empty() || e[i].back()!=n+i) e[i].push_back(n+i); } r[0]=l; for(int i=1;i<=k;i++) { r[i]=max(r[i],r[i-1]); for(int j=r[i-1];j<min(n+1,r[i]);j++) { if(mtch[n+j]!=0 && mtch[n+j]!=-1) { mtch[mtch[n+j]]=-1; mtch[n+j]=0; } if(!e[j].empty() && e[j].back()==n+j) e[j].pop_back(); } //cerr<<i<<" "<<l<<" "<<r[i]<<"\n"; while(r[i]<=n && !check(r[i],n,l,r[i])) r[i]++; r[i]=min(n+1,r[i]); ans[i-1]+=r[i]-r[i-1]; //cerr<<i<<" ["<<l<<","<<r[i]<<"]\n\n"; } ans[k]+=n+1-r[k]; } for(int i=0;i<=k;i++) cout<<ans[i]<<"\n"; return 0; } |
English