#include<bits/stdc++.h>
using namespace std;
template <typename T> T getczary(){//magia!
int ujemna = false, znak = getchar_unlocked();
T wynik = (T)0;
while(!isdigit(znak)){
if(znak == '-')
ujemna = true;
znak = getchar_unlocked();
}
while(isdigit(znak)){
wynik *= 10;
wynik += znak - '0';
znak = getchar_unlocked();
}
if(ujemna)
wynik *= -1;
return wynik;
}
#define pc(x) putchar_unlocked(x);
inline void kout(int n){
int N = n, rev, count = 0;
rev = N;
if (N == 0) { pc('0'); pc('\n'); return ;}
while ((rev % 10) == 0) { count++; rev /= 10;}
rev = 0;
while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}
while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
while (count--) pc('0');
pc('\n');
}
bool cyrkowcy[2007][2007];
int n, k;
vector<int> g[2007], mt;
vector<bool> used;
bool try_kuhn(int v){
if(used[v])
return false;
used[v] = true;
for(int to : g[v]){
if(mt[to] == -1 || try_kuhn(mt[to])){
mt[to] = v;
return true;
}
}
return false;
}
int N, m, q;
int t[2007][2007];
int maks_skojarzenie(){
int nr[2] = {0, 0};
for(int i = 1;i <= N;i++){
g[i].clear();
for(int j = 1;j <= N;j++)
t[i][j] = ++nr[cyrkowcy[i][j]];
}
for(int i = 1;i <= N;i++){
for(int j = 1;j <= N;j++){
if(cyrkowcy[i][j] == 1) continue;
for(int z = 1;z <= N;z++){
if(cyrkowcy[i][j] != cyrkowcy[i][z]){
g[t[i][j]].push_back(t[i][z]);
}
if(cyrkowcy[i][j] != cyrkowcy[z][j]){
g[t[i][j]].push_back(t[z][j]);
}
}
}
}
n = nr[0]; k = nr[1];
mt.assign(k + 7, -1);
vector<bool> used1(n + 7, false);
for(int v = 1;v <= n;++v){
for(int to : g[v]){
if(mt[to] == -1){
mt[to] = v;
used1[v] = true;
break;
}
}
}
for(int v = 1;v <= n;++v){
if(used1[v])
continue;
used.assign(n + 7, false);
try_kuhn(v);
}
int res = 0;
for(int i = 1;i <= k;++i)
if(mt[i] != -1)
res++;
return res;
}
int main(){
N = getczary<int>();
m = getczary<int>();
q = getczary<int>();
for(int i = 0, x1, y1, x2, y2;i < m;i++){
x1 = getczary<int>();
y1 = getczary<int>();
x2 = getczary<int>();
y2 = getczary<int>();
for(int x = x1;x <= x2;x++)
for(int y = y1;y <= y2;y++)
cyrkowcy[x][y] ^= 1;
}
kout(maks_skojarzenie());
for(int i = 0, x, y;i < q;i++){
x = getczary<int>();
y = getczary<int>();
cyrkowcy[x][y] ^= 1;
kout(maks_skojarzenie());
}
}
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 | #include<bits/stdc++.h> using namespace std; template <typename T> T getczary(){//magia! int ujemna = false, znak = getchar_unlocked(); T wynik = (T)0; while(!isdigit(znak)){ if(znak == '-') ujemna = true; znak = getchar_unlocked(); } while(isdigit(znak)){ wynik *= 10; wynik += znak - '0'; znak = getchar_unlocked(); } if(ujemna) wynik *= -1; return wynik; } #define pc(x) putchar_unlocked(x); inline void kout(int n){ int N = n, rev, count = 0; rev = N; if (N == 0) { pc('0'); pc('\n'); return ;} while ((rev % 10) == 0) { count++; rev /= 10;} rev = 0; while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;} while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;} while (count--) pc('0'); pc('\n'); } bool cyrkowcy[2007][2007]; int n, k; vector<int> g[2007], mt; vector<bool> used; bool try_kuhn(int v){ if(used[v]) return false; used[v] = true; for(int to : g[v]){ if(mt[to] == -1 || try_kuhn(mt[to])){ mt[to] = v; return true; } } return false; } int N, m, q; int t[2007][2007]; int maks_skojarzenie(){ int nr[2] = {0, 0}; for(int i = 1;i <= N;i++){ g[i].clear(); for(int j = 1;j <= N;j++) t[i][j] = ++nr[cyrkowcy[i][j]]; } for(int i = 1;i <= N;i++){ for(int j = 1;j <= N;j++){ if(cyrkowcy[i][j] == 1) continue; for(int z = 1;z <= N;z++){ if(cyrkowcy[i][j] != cyrkowcy[i][z]){ g[t[i][j]].push_back(t[i][z]); } if(cyrkowcy[i][j] != cyrkowcy[z][j]){ g[t[i][j]].push_back(t[z][j]); } } } } n = nr[0]; k = nr[1]; mt.assign(k + 7, -1); vector<bool> used1(n + 7, false); for(int v = 1;v <= n;++v){ for(int to : g[v]){ if(mt[to] == -1){ mt[to] = v; used1[v] = true; break; } } } for(int v = 1;v <= n;++v){ if(used1[v]) continue; used.assign(n + 7, false); try_kuhn(v); } int res = 0; for(int i = 1;i <= k;++i) if(mt[i] != -1) res++; return res; } int main(){ N = getczary<int>(); m = getczary<int>(); q = getczary<int>(); for(int i = 0, x1, y1, x2, y2;i < m;i++){ x1 = getczary<int>(); y1 = getczary<int>(); x2 = getczary<int>(); y2 = getczary<int>(); for(int x = x1;x <= x2;x++) for(int y = y1;y <= y2;y++) cyrkowcy[x][y] ^= 1; } kout(maks_skojarzenie()); for(int i = 0, x, y;i < q;i++){ x = getczary<int>(); y = getczary<int>(); cyrkowcy[x][y] ^= 1; kout(maks_skojarzenie()); } } |
English