Codeforces 325D
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <ctime> 6 #include <cmath> 7 #include <map> 8 #include <set> 9 using namespace std; 10 11 const int maxn=3000*3000*2+100; 12 const int dx[8]={-1, -1, -1, 0, 0, 1, 1, 1}; 13 const int dy[8]={-1, 0, 1, -1, 1, -1, 0, 1}; 14 15 int n, r, c, ti; 16 int ans; 17 int fa[maxn]; 18 bool vis[3010][6010]; 19 int mark[maxn]; 20 21 int find(int cur) 22 { 23 if (fa[cur]<0) return cur; 24 else return (find(fa[cur])); 25 } 26 void Union(int u, int v) 27 { 28 u=find(u); 29 v=find(v); 30 if (u==v) return; 31 if (fa[u]>fa[v]) swap(u, v); 32 fa[u]+=fa[v]; 33 fa[v]=u; 34 } 35 bool check(int &x1, int &y1) 36 { 37 if (x1<1 || x1>r) return false; 38 if (y1==0) y1=c; 39 else if (y1>c) y1=1; 40 if (!vis[x1][y1]) return false; 41 return true; 42 } 43 void merge(int x, int y) 44 { 45 int nid=(x-1)*c+y; 46 for (int i=0; i<8; ++i) 47 { 48 int x1=x+dx[i]; 49 int y1=y+dy[i]; 50 if (check(x1, y1)) Union(nid, (x1-1)*c+y1); 51 } 52 } 53 bool get_list(int x, int y, int id) 54 { 55 for (int i=0; i<8; ++i) 56 { 57 int x1=x+dx[i]; 58 int y1=y+dy[i]; 59 if (!check(x1, y1)) continue; 60 int tmp=find((x1-1)*c+y1); 61 if (id && mark[tmp]==ti-1) return false; 62 mark[tmp]=ti; 63 } 64 return true; 65 } 66 void solve() 67 { 68 if (c==1) return; 69 c*=2; 70 71 for (int i=1; i<=r; ++i) 72 for (int j=1; j<=c; ++j) 73 fa[(i-1)*c+j]=-1; 74 75 for (int i=1; i<=n; ++i) 76 { 77 int x, y; 78 scanf("%d%d", &x, &y); 79 ++ti; 80 get_list(x, y, 0); 81 ++ti; 82 bool flag=get_list(x, y+c/2, 1); 83 if (!flag) continue; 84 ++ans; 85 merge(x, y); 86 merge(x, y+c/2); 87 vis[x][y]=true; 88 vis[x][y+c/2]=true; 89 } 90 } 91 int main() 92 { 93 freopen("input.txt", "r", stdin); 94 freopen("output.txt", "w", stdout); 95 scanf("%d%d%d", &r, &c, &n); 96 solve(); 97 printf("%d\n", ans); 98 return 0; 99 }