#include<cstdio> #include<algorithm> #include<vector> #define S 2007 using namespace std; int T[S][S]; vector < pair < int , int > > V[S][S]; int n; int nr = 0; pair < int , int > partner[S][S]; int odw[S][S]; bool zablo[S][S]; bool match(int x, int y){ odw[x][y] = nr; for(int i = 0 ; i < V[x][y].size();i++){ int x1 = V[x][y][i].first; int y1 = V[x][y][i].second; if(partner[x1][y1] == make_pair(0,0)){ partner[x1][y1] = {x,y}; return true; } } for(int i = 0 ; i < V[x][y].size();i++){ int x1 = V[x][y][i].first; int y1 = V[x][y][i].second; int x2 = partner[x1][y1].first; int y2 = partner[x1][y1].second; if(odw[x2][y2] != nr && !zablo[x2][y2]){ if(match(x2,y2)){ partner[x1][y1] = {x,y}; return true; }else{ zablo[x2][y2] = 1; } } } return false; } void odpowiedz(){ for(int i = 1; i <= n;i++){ for(int j = 1; j <= n;j++){ V[i][j].clear(); partner[i][j] = {0,0}; odw[i][j] = 0; zablo[i][j] = 0; if(T[i][j]%2 == 1){ for(int k = 1; k <= n;k++){ if(T[i][k]%2 == 0){ V[i][j].push_back({i,k}); } if(T[k][j]%2 == 0){ V[i][j].push_back({k,j}); } } } } } nr = 0; int odp = 0; for(int i = 1; i <= n;i++){ for(int j = 1; j <= n;j++){ if(T[i][j]%2 == 1){ nr++; if(match(i,j)) odp++; } } } printf("%d\n",odp); } int main(void){ int m,q; scanf("%d %d %d",&n,&m,&q); int x1,x2,y1,y2; for(int i = 1; i <= m;i++){ scanf("%d %d %d %d",&x1,&y1,&x2,&y2); if(x1 > x2) swap(x1,x2); if(y1 > y2) swap(y1,y2); T[x1][y1]++; T[x2+1][y1]--; T[x1][y2+1]--; T[x2+1][y2+1]++; } for(int i = 1; i <= n;i++){ for(int j = 1; j <= n;j++){ T[i][j] += (T[i-1][j] + T[i][j-1] - T[i-1][j-1]); } } odpowiedz(); for(int i = 1; i <= q;i++){ scanf("%d %d",&x1,&y1); T[x1][y1]++; odpowiedz(); } 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 | #include<cstdio> #include<algorithm> #include<vector> #define S 2007 using namespace std; int T[S][S]; vector < pair < int , int > > V[S][S]; int n; int nr = 0; pair < int , int > partner[S][S]; int odw[S][S]; bool zablo[S][S]; bool match(int x, int y){ odw[x][y] = nr; for(int i = 0 ; i < V[x][y].size();i++){ int x1 = V[x][y][i].first; int y1 = V[x][y][i].second; if(partner[x1][y1] == make_pair(0,0)){ partner[x1][y1] = {x,y}; return true; } } for(int i = 0 ; i < V[x][y].size();i++){ int x1 = V[x][y][i].first; int y1 = V[x][y][i].second; int x2 = partner[x1][y1].first; int y2 = partner[x1][y1].second; if(odw[x2][y2] != nr && !zablo[x2][y2]){ if(match(x2,y2)){ partner[x1][y1] = {x,y}; return true; }else{ zablo[x2][y2] = 1; } } } return false; } void odpowiedz(){ for(int i = 1; i <= n;i++){ for(int j = 1; j <= n;j++){ V[i][j].clear(); partner[i][j] = {0,0}; odw[i][j] = 0; zablo[i][j] = 0; if(T[i][j]%2 == 1){ for(int k = 1; k <= n;k++){ if(T[i][k]%2 == 0){ V[i][j].push_back({i,k}); } if(T[k][j]%2 == 0){ V[i][j].push_back({k,j}); } } } } } nr = 0; int odp = 0; for(int i = 1; i <= n;i++){ for(int j = 1; j <= n;j++){ if(T[i][j]%2 == 1){ nr++; if(match(i,j)) odp++; } } } printf("%d\n",odp); } int main(void){ int m,q; scanf("%d %d %d",&n,&m,&q); int x1,x2,y1,y2; for(int i = 1; i <= m;i++){ scanf("%d %d %d %d",&x1,&y1,&x2,&y2); if(x1 > x2) swap(x1,x2); if(y1 > y2) swap(y1,y2); T[x1][y1]++; T[x2+1][y1]--; T[x1][y2+1]--; T[x2+1][y2+1]++; } for(int i = 1; i <= n;i++){ for(int j = 1; j <= n;j++){ T[i][j] += (T[i-1][j] + T[i][j-1] - T[i-1][j-1]); } } odpowiedz(); for(int i = 1; i <= q;i++){ scanf("%d %d",&x1,&y1); T[x1][y1]++; odpowiedz(); } return 0; } |