【JZOJ 3809】设备塔

来源:互联网 发布:买家怎么取消淘宝介入 编辑:程序博客网 时间:2024/06/06 14:56

Description

为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔。
简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是
传输信息所用的数据通道,划分成N *m 个区块。
然而,随着工作的继续进行,他们希望把侧面的一部分区块也改造成其他模块。然而,任何时候都
必须保证存在一条数据通道,能从圆柱体的一端通向另一端。
由于无法使用辉之环掌控下的计算系统,他们寻求你的帮助来解决这个问题。他们将逐个输入想要
改造的区域,而你则执行所有可行的改造并忽略可能导致数据中断的改造。

Solution

先把原来的倍长一倍,
有一个已经放了的点,如果它附近(8个方向)还有点,则这两个点联通,
每次加上一个点,就看看加上它在图中的原位置和倍长后的位置,这两个点是否联通,是则不能放,

复杂度:O(nm)

Code

#include <iostream>#include <cstdio>#include <cstdlib>#define fo(i,a,b) for(int i=a;i<=b;i++)#define min(q,w) ((q)<(w)?(q):(w))#define OK(q) ((q)>0&&(q)<=n)#define H(q,w) ((q)*m-m+(w)) using namespace std;const int N=5005;int read(int &n){    char ch=' ';int q=0,w=1;    for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());    if(ch=='-')w=-1,ch=getchar();    for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;}int n,m,Ti,ans,m1;int g[N*2*N];int fx[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};int y1[8],y[8];int z[N][N*2];int gf(int q){return g[q]==q?q:g[q]=gf(g[q]);}bool OK1(){    fo(i,0,7)fo(j,0,7)if(y[i]==y1[j]&&y[i])return 0;    return 1;}int main(){    int q,w,e,q1,w1;    read(n),read(m),read(m1);    e=m;m*=2;    fo(i,1,n)fo(j,1,m)g[H(i,j)]=H(i,j);    if(m==2){printf("1\n");return 0;}    fo(I,1,m1)    {        read(q),read(w);        int x=gf(g[H(q,w)]);        fo(k,0,7)if(OK(q+fx[k][0]))        {            q1=q+fx[k][0];            if(z[q1][w1=1+(w-1+fx[k][1]+m)%m])y[k]=gf(H(q1,w1));            else y[k]=0;        }else y[k]=0;        w+=e;        int x1=gf(g[H(q,w)]);        fo(k,0,7)if(OK(q+fx[k][0]))        {            q1=q+fx[k][0];            if(z[q1][w1=1+(w-1+fx[k][1]+m)%m])y1[k]=gf(H(q1,w1));            else y1[k]=0;        }else y1[k]=0;        if(OK1())        {            fo(k,0,7)g[y[k]]=x;            fo(k,0,7)g[y1[k]]=x1;            g[0]=0;            ans++;            z[q][w]=1;z[q][w-e]=1;        }    }    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击