#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; } |