#include <bits/stdc++.h> int n, m, q; int a, b, c, d; int czas=1; long long wynik; int pref[2003][2003]; int odwiedzone[4000003]; int skojarzone[4000003]; std::vector<int> graf[4000003]; std::vector<int> wolni, zajeci; int z(int x, int y) { return (x-1)*n+y; } bool DFS(int x) { if(odwiedzone[x]==czas) return false; odwiedzone[x]=czas; for(int i=0; i<graf[x].size(); i++) if(skojarzone[graf[x][i]]==0 || DFS(skojarzone[graf[x][i]])) { skojarzone[x]=graf[x][i]; skojarzone[graf[x][i]]=x; return true; } return false; } int main() { scanf("%d%d%d", &n, &m, &q); for(int i=1; i<=m; i++) { scanf("%d%d%d%d", &a, &b, &c, &d); pref[c][d]++; pref[a-1][b-1]++; pref[a-1][d]--; pref[c][b-1]--; } for(int j=n; j>0; j--) { for(int i=1; i<=n; i++) pref[i][j-1]+=pref[i][j]; for(int i=n; i>0; i--) pref[i][j]+=pref[i+1][j]; } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(pref[i][j]&1) { for(int l=0; l<wolni.size(); l++) { graf[z(i, j)].push_back(wolni[l]); graf[wolni[l]].push_back(z(i, j)); } zajeci.push_back(z(i, j)); } else { for(int l=0; l<zajeci.size(); l++) { graf[z(i, j)].push_back(zajeci[l]); graf[zajeci[l]].push_back(z(i, j)); } wolni.push_back(z(i, j)); } } wolni.clear(); zajeci.clear(); } for(int j=1; j<=n; j++) { for(int i=1; i<=n; i++) { if(pref[i][j]&1) { for(int l=0; l<wolni.size(); l++) { graf[z(i, j)].push_back(wolni[l]); graf[wolni[l]].push_back(z(i, j)); } zajeci.push_back(z(i, j)); } else { for(int l=0; l<zajeci.size(); l++) { graf[z(i, j)].push_back(zajeci[l]); graf[zajeci[l]].push_back(z(i, j)); } wolni.push_back(z(i, j)); } } wolni.clear(); zajeci.clear(); } bool poprawa=true; while(poprawa) { poprawa=false; for(int i=1; i<=n*n; i++) if(skojarzone[i]==0) poprawa=std::max(poprawa, DFS(i)); czas++; } for(int i=1; i<=n*n; i++) if(skojarzone[i]!=0) wynik++; wynik/=2; printf("%lld\n", wynik); while(q--) { scanf("%d%d", &a, &b); int szuk=z(a, b); graf[szuk].clear(); for(int i=1; i<=n; i++) { if(b!=i && (pref[a][i]&1)) zajeci.push_back(z(a, i)); if(b!=i && (pref[a][i]&1)==0) wolni.push_back(z(a, i)); } if(pref[a][b]&1) { for(int i=0; i<wolni.size(); i++) for(int j=0; j<graf[wolni[i]].size(); j++) if(graf[wolni[i]][j]==szuk) { std::swap(graf[wolni[i]][j], graf[wolni[i]].back()); graf[wolni[i]].pop_back(); break; } for(int i=0; i<zajeci.size(); i++) { graf[zajeci[i]].push_back(szuk); graf[szuk].push_back(zajeci[i]); } } else { for(int i=0; i<zajeci.size(); i++) for(int j=0; j<graf[zajeci[i]].size(); j++) if(graf[zajeci[i]][j]==szuk) { std::swap(graf[zajeci[i]][j], graf[zajeci[i]].back()); graf[zajeci[i]].pop_back(); break; } for(int i=0; i<wolni.size(); i++) { graf[wolni[i]].push_back(szuk); graf[szuk].push_back(wolni[i]); } } wolni.clear(); zajeci.clear(); for(int i=1; i<=n; i++) { if(a!=i && (pref[i][b]&1)) zajeci.push_back(z(i, b)); if(a!=i && (pref[i][b]&1)==0) wolni.push_back(z(i, b)); } if(pref[a][b]&1) { for(int i=0; i<wolni.size(); i++) for(int j=0; j<graf[wolni[i]].size(); j++) if(graf[wolni[i]][j]==szuk) { std::swap(graf[wolni[i]][j], graf[wolni[i]].back()); graf[wolni[i]].pop_back(); break; } for(int i=0; i<zajeci.size(); i++) { graf[zajeci[i]].push_back(szuk); graf[szuk].push_back(zajeci[i]); } } else { for(int i=0; i<zajeci.size(); i++) for(int j=0; j<graf[zajeci[i]].size(); j++) if(graf[zajeci[i]][j]==szuk) { std::swap(graf[zajeci[i]][j], graf[zajeci[i]].back()); graf[zajeci[i]].pop_back(); break; } for(int i=0; i<wolni.size(); i++) { graf[wolni[i]].push_back(szuk); graf[szuk].push_back(wolni[i]); } } wolni.clear(); zajeci.clear(); pref[a][b]++; if(skojarzone[szuk]!=0) { wynik--; int w=skojarzone[szuk]; skojarzone[szuk]=0; skojarzone[w]=0; DFS(w); czas++; if(skojarzone[w]!=0) wynik++; } DFS(szuk); if(skojarzone[szuk]!=0) wynik++; czas++; printf("%lld\n", wynik); } }
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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | #include <bits/stdc++.h> int n, m, q; int a, b, c, d; int czas=1; long long wynik; int pref[2003][2003]; int odwiedzone[4000003]; int skojarzone[4000003]; std::vector<int> graf[4000003]; std::vector<int> wolni, zajeci; int z(int x, int y) { return (x-1)*n+y; } bool DFS(int x) { if(odwiedzone[x]==czas) return false; odwiedzone[x]=czas; for(int i=0; i<graf[x].size(); i++) if(skojarzone[graf[x][i]]==0 || DFS(skojarzone[graf[x][i]])) { skojarzone[x]=graf[x][i]; skojarzone[graf[x][i]]=x; return true; } return false; } int main() { scanf("%d%d%d", &n, &m, &q); for(int i=1; i<=m; i++) { scanf("%d%d%d%d", &a, &b, &c, &d); pref[c][d]++; pref[a-1][b-1]++; pref[a-1][d]--; pref[c][b-1]--; } for(int j=n; j>0; j--) { for(int i=1; i<=n; i++) pref[i][j-1]+=pref[i][j]; for(int i=n; i>0; i--) pref[i][j]+=pref[i+1][j]; } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(pref[i][j]&1) { for(int l=0; l<wolni.size(); l++) { graf[z(i, j)].push_back(wolni[l]); graf[wolni[l]].push_back(z(i, j)); } zajeci.push_back(z(i, j)); } else { for(int l=0; l<zajeci.size(); l++) { graf[z(i, j)].push_back(zajeci[l]); graf[zajeci[l]].push_back(z(i, j)); } wolni.push_back(z(i, j)); } } wolni.clear(); zajeci.clear(); } for(int j=1; j<=n; j++) { for(int i=1; i<=n; i++) { if(pref[i][j]&1) { for(int l=0; l<wolni.size(); l++) { graf[z(i, j)].push_back(wolni[l]); graf[wolni[l]].push_back(z(i, j)); } zajeci.push_back(z(i, j)); } else { for(int l=0; l<zajeci.size(); l++) { graf[z(i, j)].push_back(zajeci[l]); graf[zajeci[l]].push_back(z(i, j)); } wolni.push_back(z(i, j)); } } wolni.clear(); zajeci.clear(); } bool poprawa=true; while(poprawa) { poprawa=false; for(int i=1; i<=n*n; i++) if(skojarzone[i]==0) poprawa=std::max(poprawa, DFS(i)); czas++; } for(int i=1; i<=n*n; i++) if(skojarzone[i]!=0) wynik++; wynik/=2; printf("%lld\n", wynik); while(q--) { scanf("%d%d", &a, &b); int szuk=z(a, b); graf[szuk].clear(); for(int i=1; i<=n; i++) { if(b!=i && (pref[a][i]&1)) zajeci.push_back(z(a, i)); if(b!=i && (pref[a][i]&1)==0) wolni.push_back(z(a, i)); } if(pref[a][b]&1) { for(int i=0; i<wolni.size(); i++) for(int j=0; j<graf[wolni[i]].size(); j++) if(graf[wolni[i]][j]==szuk) { std::swap(graf[wolni[i]][j], graf[wolni[i]].back()); graf[wolni[i]].pop_back(); break; } for(int i=0; i<zajeci.size(); i++) { graf[zajeci[i]].push_back(szuk); graf[szuk].push_back(zajeci[i]); } } else { for(int i=0; i<zajeci.size(); i++) for(int j=0; j<graf[zajeci[i]].size(); j++) if(graf[zajeci[i]][j]==szuk) { std::swap(graf[zajeci[i]][j], graf[zajeci[i]].back()); graf[zajeci[i]].pop_back(); break; } for(int i=0; i<wolni.size(); i++) { graf[wolni[i]].push_back(szuk); graf[szuk].push_back(wolni[i]); } } wolni.clear(); zajeci.clear(); for(int i=1; i<=n; i++) { if(a!=i && (pref[i][b]&1)) zajeci.push_back(z(i, b)); if(a!=i && (pref[i][b]&1)==0) wolni.push_back(z(i, b)); } if(pref[a][b]&1) { for(int i=0; i<wolni.size(); i++) for(int j=0; j<graf[wolni[i]].size(); j++) if(graf[wolni[i]][j]==szuk) { std::swap(graf[wolni[i]][j], graf[wolni[i]].back()); graf[wolni[i]].pop_back(); break; } for(int i=0; i<zajeci.size(); i++) { graf[zajeci[i]].push_back(szuk); graf[szuk].push_back(zajeci[i]); } } else { for(int i=0; i<zajeci.size(); i++) for(int j=0; j<graf[zajeci[i]].size(); j++) if(graf[zajeci[i]][j]==szuk) { std::swap(graf[zajeci[i]][j], graf[zajeci[i]].back()); graf[zajeci[i]].pop_back(); break; } for(int i=0; i<wolni.size(); i++) { graf[wolni[i]].push_back(szuk); graf[szuk].push_back(wolni[i]); } } wolni.clear(); zajeci.clear(); pref[a][b]++; if(skojarzone[szuk]!=0) { wynik--; int w=skojarzone[szuk]; skojarzone[szuk]=0; skojarzone[w]=0; DFS(w); czas++; if(skojarzone[w]!=0) wynik++; } DFS(szuk); if(skojarzone[szuk]!=0) wynik++; czas++; printf("%lld\n", wynik); } } |