#include <bits/stdc++.h> using namespace std; const int SIZE=300; void imax(int &a, int b){ a=max(a, b); } void imin(int &a, int b){ a=min(a, b); } void lmax(long long &a, long long b){ a=max(a, b); } void lmin(long long &a, long long b){ a=min(a, b); } /* WARNING: I'm using strange bracket style! */ struct Matching{ static const int INF = 1000000666; int n; std::vector<std::vector<int> > g; std::vector<int> match, col, U, dist; Matching(){} Matching(int N){ n = N; g = std::vector<std::vector<int> >(n+1); match = col = dist = std::vector<int>(n+1); } void add_edge(int a, int b){ g[a].push_back(b); g[b].push_back(a); } void color(int v, int c){ if((col[v] = c) == 1) U.push_back(v); for(auto ch : g[v]) if(!col[ch]) color(ch, (c == 1 ? 2 : 1)); } bool bfs(){ std::queue<int> que; for(auto u : U) if(!match[u]) dist[u] = 0, que.push(u); else dist[u] = INF; dist[0] = INF; while(!que.empty()){ int u = que.front(); que.pop(); if(dist[u] < dist[0]) for(auto v : g[u]) if(dist[match[v]] == INF) dist[match[v]] = dist[u] + 1, que.push(match[v]); } return dist[0] != INF; } bool dfs(int u){ if(!u) return true; for(auto v : g[u]) if(dist[match[v]] == dist[u] + 1 && dfs(match[v])) return match[v] = u, match[u] = v; return dist[u] = INF, false; } int max_matching(){ for(int i = 1; i <= n; ++i) if(!col[i]) color(i, 1); int ret = 0; while(bfs()) for(auto u : U) if(!match[u] && dfs(u)) ret++; return ret; } }; int events[SIZE][SIZE]; int arr[SIZE][SIZE]; Matching Knapik; int n, q, k, A, B, C, D, Q; void update(int X, int Y, int Z, int T){ for (int i=X; i<=Z; i++) events[i][Y]^=1, events[i][T+1]^=1; } int getAns(){ Knapik=Matching(n*n+n*5); for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) if (arr[i][j]) for (int g=1; g<=n; g++) { if (!arr[i][g]) Knapik.add_edge(i*n+j, i*n+g); if (!arr[g][j]) Knapik.add_edge(i*n+j, g*n+j); } return Knapik.max_matching(); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k>>q; while (k--) cin>>A>>B>>C>>D, update(A, B, C, D); for (int i=1; i<=n; i++) { k=0; for (int j=1; j<=n; j++) k^=events[i][j], arr[i][j]=k; } cout<<getAns()<<"\n"; while (q--) cin>>A>>B, arr[A][B]^=1, cout<<getAns()<<"\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 | #include <bits/stdc++.h> using namespace std; const int SIZE=300; void imax(int &a, int b){ a=max(a, b); } void imin(int &a, int b){ a=min(a, b); } void lmax(long long &a, long long b){ a=max(a, b); } void lmin(long long &a, long long b){ a=min(a, b); } /* WARNING: I'm using strange bracket style! */ struct Matching{ static const int INF = 1000000666; int n; std::vector<std::vector<int> > g; std::vector<int> match, col, U, dist; Matching(){} Matching(int N){ n = N; g = std::vector<std::vector<int> >(n+1); match = col = dist = std::vector<int>(n+1); } void add_edge(int a, int b){ g[a].push_back(b); g[b].push_back(a); } void color(int v, int c){ if((col[v] = c) == 1) U.push_back(v); for(auto ch : g[v]) if(!col[ch]) color(ch, (c == 1 ? 2 : 1)); } bool bfs(){ std::queue<int> que; for(auto u : U) if(!match[u]) dist[u] = 0, que.push(u); else dist[u] = INF; dist[0] = INF; while(!que.empty()){ int u = que.front(); que.pop(); if(dist[u] < dist[0]) for(auto v : g[u]) if(dist[match[v]] == INF) dist[match[v]] = dist[u] + 1, que.push(match[v]); } return dist[0] != INF; } bool dfs(int u){ if(!u) return true; for(auto v : g[u]) if(dist[match[v]] == dist[u] + 1 && dfs(match[v])) return match[v] = u, match[u] = v; return dist[u] = INF, false; } int max_matching(){ for(int i = 1; i <= n; ++i) if(!col[i]) color(i, 1); int ret = 0; while(bfs()) for(auto u : U) if(!match[u] && dfs(u)) ret++; return ret; } }; int events[SIZE][SIZE]; int arr[SIZE][SIZE]; Matching Knapik; int n, q, k, A, B, C, D, Q; void update(int X, int Y, int Z, int T){ for (int i=X; i<=Z; i++) events[i][Y]^=1, events[i][T+1]^=1; } int getAns(){ Knapik=Matching(n*n+n*5); for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) if (arr[i][j]) for (int g=1; g<=n; g++) { if (!arr[i][g]) Knapik.add_edge(i*n+j, i*n+g); if (!arr[g][j]) Knapik.add_edge(i*n+j, g*n+j); } return Knapik.max_matching(); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k>>q; while (k--) cin>>A>>B>>C>>D, update(A, B, C, D); for (int i=1; i<=n; i++) { k=0; for (int j=1; j<=n; j++) k^=events[i][j], arr[i][j]=k; } cout<<getAns()<<"\n"; while (q--) cin>>A>>B, arr[A][B]^=1, cout<<getAns()<<"\n"; return 0; } |