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