zoukankan      html  css  js  c++  java
  • 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
    ", ans);
    98     return 0;
    99 }
    View Code
  • 相关阅读:
    python-单链表的实现
    python-树形结构和遍历
    python四种简单排序
    python数据类型
    python安装和配置
    Js 中的false,零值,null,undefined和空字符串对象
    console和chrom-tool
    js中声明Number的五种方式
    vue下拉搜索
    canvas猜数游戏
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/5058128.html
Copyright © 2011-2022 走看看