#include <bits/stdc++.h>
#define uset unordered_set
#define mt make_tuple
#define pii pair<int,int>
#define f first
#define s second
using namespace std;
bool Dfs(int u,vector<bool>&Vis,vector<int>&M,vector<uset<int>>&G)
{
if(Vis[u])
return false;
Vis[u]=true;
for(int v:G[u])
if(M[v]==-1 || Dfs(M[v],Vis,M,G))
{
M[u]=v;
M[v]=u;
return true;
}
return false;
}
void Turbo(int n,vector<int>&M,vector<uset<int>>&G)
{
for(int i=0;i<n;i++)
M[i]=-1;
vector<bool>Vis(n);
bool increased=true;
while(increased)
{
increased=false;
for(int u=0;u<n;u++)
Vis[u]=false;
for(int u=0;u<n;u++)
if(M[u]==-1 && Dfs(u,Vis,M,G))
increased=true;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,q;
cin>>n>>m>>q;
vector<vector<int>>M(n,vector<int>(n,0));
for(int i=0;i<m;i++)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
for(int i=x1-1;i<x2;i++)
for(int j=y1-1;j<y2;j++)
M[i][j]++;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
M[i][j]%=2;
vector<uset<int>>G(n*n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
if(M[k][j]!=M[i][j])
G[i*n+j].insert(k*n+j);
for(int k=0;k<n;k++)
if(M[i][k]!=M[i][j])
G[i*n+j].insert(i*n+k);
}
}
vector<int>Wyn(n*n,-1);
Turbo(n*n,Wyn,G);
long long wynik=0;
for(int i=0;i<n*n;i++)
if(Wyn[i]>=0)
wynik++;
cout<<wynik/2<<"\n";
/*for(int i=0;i<n*n;i++)
{
cout<<i+1<<": ";
for(int j=0;j<G[i].size();j++)
cout<<G[i][j]+1<<" ";
cout<<endl;
}*/
for(int p=0;p<q;p++)
{
int a1,b1;
cin>>a1>>b1;
a1--; b1--;
int g=a1*n+b1;
M[a1][b1]=1-M[a1][b1];
for(int k=0;k<n;k++)
{
if(M[a1][k]==M[a1][b1])
{
G[a1*n+k].erase(g);
G[g].erase(a1*n+k);
}
else
{
G[a1*n+k].insert(g);
G[g].insert(a1*n+k);
}
}
for(int k=0;k<n;k++)
{
if(M[k][b1]==M[a1][b1])
{
G[k*n+b1].erase(g);
G[g].erase(k*n+b1);
}
else
{
G[k*n+b1].insert(g);
G[g].insert(k*n+b1);
}
}
fill(Wyn.begin(),Wyn.end(),-1);
Turbo(n*n,Wyn,G);
long long wynik=0;
for(int i=0;i<n*n;i++)
if(Wyn[i]>=0)
wynik++;
cout<<wynik/2<<"\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 122 123 124 125 126 127 128 129 | #include <bits/stdc++.h> #define uset unordered_set #define mt make_tuple #define pii pair<int,int> #define f first #define s second using namespace std; bool Dfs(int u,vector<bool>&Vis,vector<int>&M,vector<uset<int>>&G) { if(Vis[u]) return false; Vis[u]=true; for(int v:G[u]) if(M[v]==-1 || Dfs(M[v],Vis,M,G)) { M[u]=v; M[v]=u; return true; } return false; } void Turbo(int n,vector<int>&M,vector<uset<int>>&G) { for(int i=0;i<n;i++) M[i]=-1; vector<bool>Vis(n); bool increased=true; while(increased) { increased=false; for(int u=0;u<n;u++) Vis[u]=false; for(int u=0;u<n;u++) if(M[u]==-1 && Dfs(u,Vis,M,G)) increased=true; } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,m,q; cin>>n>>m>>q; vector<vector<int>>M(n,vector<int>(n,0)); for(int i=0;i<m;i++) { int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; for(int i=x1-1;i<x2;i++) for(int j=y1-1;j<y2;j++) M[i][j]++; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) M[i][j]%=2; vector<uset<int>>G(n*n); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<n;k++) if(M[k][j]!=M[i][j]) G[i*n+j].insert(k*n+j); for(int k=0;k<n;k++) if(M[i][k]!=M[i][j]) G[i*n+j].insert(i*n+k); } } vector<int>Wyn(n*n,-1); Turbo(n*n,Wyn,G); long long wynik=0; for(int i=0;i<n*n;i++) if(Wyn[i]>=0) wynik++; cout<<wynik/2<<"\n"; /*for(int i=0;i<n*n;i++) { cout<<i+1<<": "; for(int j=0;j<G[i].size();j++) cout<<G[i][j]+1<<" "; cout<<endl; }*/ for(int p=0;p<q;p++) { int a1,b1; cin>>a1>>b1; a1--; b1--; int g=a1*n+b1; M[a1][b1]=1-M[a1][b1]; for(int k=0;k<n;k++) { if(M[a1][k]==M[a1][b1]) { G[a1*n+k].erase(g); G[g].erase(a1*n+k); } else { G[a1*n+k].insert(g); G[g].insert(a1*n+k); } } for(int k=0;k<n;k++) { if(M[k][b1]==M[a1][b1]) { G[k*n+b1].erase(g); G[g].erase(k*n+b1); } else { G[k*n+b1].insert(g); G[g].insert(k*n+b1); } } fill(Wyn.begin(),Wyn.end(),-1); Turbo(n*n,Wyn,G); long long wynik=0; for(int i=0;i<n*n;i++) if(Wyn[i]>=0) wynik++; cout<<wynik/2<<"\n"; } return 0; } |
English