#include<bits/stdc++.h>
using namespace std;
int n,m,q,t[2005][2005],x,y,x2,y2,nr[2005][2005],para[4000005],odw[4000005],N = 1;
vector <int> G[4000005],ch;
bool skoj(int v)
{
odw[v] = N;
int s = G[v].size();
for(int i = 0;i < s; i++)
{
int u = G[v][i];
if(!para[u])
{
para[u] = v;
return 1;
}
int s2 = G[u].size();
for(int j = 0;j < s2; j++)
{
int w = G[u][j];
if(odw[w] < N && skoj(w))
{
para[u] = v;
return 1;
}
}
}
return 0;
}
int szukajSkojarzenia()
{
int w = 0,s = ch.size();
N = 1;
for(int i = 0;i < s; i++, N++)
{
if(skoj(ch[i]))
w++;
}
return w;
}
void czysc()
{
for(int i = 1;i <= n * n; i++)
{
para[i] = 0;
odw[i] = 0;
G[i].clear();
}
ch.clear();
return;
}
void graf()
{
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n; j++)
if(t[j][i])
{
for(int k = 1;k <= n; k++)
{
if(!t[k][i])
{
G[nr[j][i]].push_back(nr[k][i]);
G[nr[k][i]].push_back(nr[j][i]);
}
if(!t[j][k])
{
G[nr[j][i]].push_back(nr[j][k]);
G[nr[j][k]].push_back(nr[j][i]);
}
}
ch.push_back(nr[j][i]);
}
return;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
for(int i = 0;i < m; i++)
{
cin>>x>>y>>x2>>y2;
t[x][y]++;
t[x2 + 1][y]--;
t[x][y2 + 1]--;
t[x2 + 1][y2 + 1]++;
}
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n;j++)
t[j][i] += t[j - 1][i];
int p = 1;
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n; j++)
{
t[i][j] = (t[i][j] + t[i][j - 1] + 2) % 2;
nr[j][i] = p++;
}
graf();
cout<<szukajSkojarzenia()<<'\n';
for(int i = 0;i < q; i++)
{
cin>>x>>y;
czysc();
t[x][y]++;
t[x][y] %= 2;
graf();
cout<<szukajSkojarzenia()<<'\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 111 112 113 114 115 116 117 118 119 120 121 | #include<bits/stdc++.h> using namespace std; int n,m,q,t[2005][2005],x,y,x2,y2,nr[2005][2005],para[4000005],odw[4000005],N = 1; vector <int> G[4000005],ch; bool skoj(int v) { odw[v] = N; int s = G[v].size(); for(int i = 0;i < s; i++) { int u = G[v][i]; if(!para[u]) { para[u] = v; return 1; } int s2 = G[u].size(); for(int j = 0;j < s2; j++) { int w = G[u][j]; if(odw[w] < N && skoj(w)) { para[u] = v; return 1; } } } return 0; } int szukajSkojarzenia() { int w = 0,s = ch.size(); N = 1; for(int i = 0;i < s; i++, N++) { if(skoj(ch[i])) w++; } return w; } void czysc() { for(int i = 1;i <= n * n; i++) { para[i] = 0; odw[i] = 0; G[i].clear(); } ch.clear(); return; } void graf() { for(int i = 1;i <= n; i++) for(int j = 1;j <= n; j++) if(t[j][i]) { for(int k = 1;k <= n; k++) { if(!t[k][i]) { G[nr[j][i]].push_back(nr[k][i]); G[nr[k][i]].push_back(nr[j][i]); } if(!t[j][k]) { G[nr[j][i]].push_back(nr[j][k]); G[nr[j][k]].push_back(nr[j][i]); } } ch.push_back(nr[j][i]); } return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i = 0;i < m; i++) { cin>>x>>y>>x2>>y2; t[x][y]++; t[x2 + 1][y]--; t[x][y2 + 1]--; t[x2 + 1][y2 + 1]++; } for(int i = 1;i <= n; i++) for(int j = 1;j <= n;j++) t[j][i] += t[j - 1][i]; int p = 1; for(int i = 1;i <= n; i++) for(int j = 1;j <= n; j++) { t[i][j] = (t[i][j] + t[i][j - 1] + 2) % 2; nr[j][i] = p++; } graf(); cout<<szukajSkojarzenia()<<'\n'; for(int i = 0;i < q; i++) { cin>>x>>y; czysc(); t[x][y]++; t[x][y] %= 2; graf(); cout<<szukajSkojarzenia()<<'\n'; } return 0; } |
English