Submission #66392

#TimeUsernameProblemLanguageResultExecution timeMemory
66392ansol4328문명 (KOI17_civilization)C++98
54 / 100
1066 ms44660 KiB
#include<stdio.h>
#include<memory.h>
#include<queue>

using namespace std;

int n, k;
int visit[2002][2002];

struct uf
{
    int p[4000002];
    int cnt;
    bool st[4000002];
    void setup(int a)
    {
        cnt=a;
        memset(p,-1,sizeof(p));
        memset(st,false,sizeof(st));
    }
    int f(int v)
    {
        if(p[v]==-1) return v;
        p[v]=f(p[v]);
        return p[v];
    }
    void u(int v1, int v2) // v2 subtree -> v1 subtree
    {
        v1=f(v1);
        v2=f(v2);
        if(v1==v2) return;
        if(st[v2]) cnt--;
        p[v2]=v1;
    }
};

uf T;
queue<int> Q;

int main()
{
    scanf("%d %d",&n,&k);
    T.setup(k);
    for(int i=0 ; i<k ; i++)
    {
        int x, y;
        scanf("%d %d",&y,&x);
        T.st[(y-1)*n+x-1]=true;
        Q.push((y-1)*n+x-1);
        visit[y][x]=1;
    }
    int res=1;
    int dy[4]={-1,0,1,0};
    int dx[4]={0,1,0,-1};
    while(T.cnt!=1)
    {
        int y=Q.front()/n+1;
        int x=Q.front()%n+1;
        Q.pop();
        res=max(res,visit[y][x]);
        for(int i=0 ; i<4 ; i++)
        {
            if(!(y+dy[i]>=1 && y+dy[i]<=n && x+dx[i]>=1 && x+dx[i]<=n)) continue;
            if(visit[y+dy[i]][x+dx[i]]==0)
            {
                visit[y+dy[i]][x+dx[i]]=visit[y][x]+1;
                T.u((y-1)*n+x-1,(y+dy[i]-1)*n+x+dx[i]-1);
                Q.push((y+dy[i]-1)*n+x+dx[i]-1);
            }
            else if(visit[y+dy[i]][x+dx[i]]<visit[y][x]+1)
            {
                T.u((y-1)*n+x-1,(y+dy[i]-1)*n+x+dx[i]-1);
                res=max(res,visit[y][x]);
            }
            if(T.cnt==1) break;
        }
    }
    printf("%d",res-1);
    return 0;
}

Compilation message (stderr)

civilization.cpp: In function 'int main()':
civilization.cpp:42:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&n,&k);
     ~~~~~^~~~~~~~~~~~~~~
civilization.cpp:47:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d",&y,&x);
         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...