#include<cstdio> #include<cstdlib> struct Lattice{ int x, y; }la[200000]; int cmpx(const void* c, const void* d){ Lattice* a = (Lattice*)c; Lattice* b = (Lattice*)d; if (a->x == b->x) return a->y - b->y; else return a->x - b->x; } int cmpy(const void* c, const void* d){ Lattice* a = (Lattice*)c; Lattice* b = (Lattice*)d; if (a->y == b->y) return a->x - b->x; else return a->y - b->y; } int main(){ int T; scanf("%d", &T); while(T--){ int m, n , k; scanf("%d%d%d", &m, &n, &k); for (int i = 0; i < k; ++i) scanf("%d%d", &la[i].x, &la[i].y); int po = 0; if (k == 0) po = m + n; else{ qsort(la, k, sizeof(Lattice), cmpx); po += la[0].x - 1; if (la[0].y > 2) ++po; for (int i = 0; i < k - 1; ++i) if (la[i].x == la[i+1].x){ if (la[i].y + 2 < la[i+1].y) ++po; }else{ po += la[i+1].x - la[i].x - 1; if (la[i].y + 1 < n) ++po; if (la[i+1].y > 2) ++po; } if (la[k-1].y + 1 < n) ++po; po += m - la[k-1].x; qsort(la, k, sizeof(Lattice), cmpy); po += la[0].y - 1; if (la[0].x > 2) ++po; for (int i = 0; i < k - 1; ++i) if (la[i].y == la[i+1].y ){ if (la[i].x + 2 < la[i+1].x) ++po; }else{ po += la[i+1].y - la[i].y - 1; if (la[i].x + 1 < m) ++po; if (la[i+1].x > 2) ++po; } if (la[k-1].x + 1 < m) ++po; po += n - la[k-1].y; } printf("%d\n", po); } return 0; } |
Double click to view unformatted code.