SGU128 Snake

注意:用vector離散化時,先sort,再unique。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int tree[10005],f[10005],n;
vector<int> d;
struct point{
    int x,y,id;
    bool isl;
}p[10005];
bool cmpx(const point &a,const point &b)
{
    if(a.x==b.x)
        return a.y<b.y;
    else
        return a.x<b.x;
}
bool cmpy(const point &a,const point &b)
{
    if(a.y==b.y)
        return a.x<b.x;
    else
        return a.y<b.y;
}
void discretize()
{
    sort(d.begin(),d.end());
    d.resize(distance(d.begin(),unique(d.begin(),d.end())));
}
int find(int idx)
{
    if(f[idx]==idx)
        return idx;
    else
        return  f[idx]=find(f[idx]);
}
void merge(int idx,int idy)
{
    if(find(idx)==find(idy))
        return ;
    else
    {
        f[f[idx]]=f[idy];
        return ;
    }
}
int lowbit(int idx)
{
    return idx&(-idx);
}
int query(int idx)
{
    int i=idx,ret=0;
    while(idx>0)
    {
        ret+=tree[idx];
        idx-=lowbit(idx);
    }
    return ret;
}
void update(int idx,int val)
{
    int i=idx;
    while(idx<10005)
    {
        tree[idx]+=val;
        idx+=lowbit(idx);
    }
}
void work()
{
    memset(tree,0,sizeof(tree));
    scanf("%d",&n);
    int i,len=0,idx1,idx2;
    for(i=1;i<=n;++i)
        f[i]=i;
    d.clear();
    for(i=1;i<=n;++i)
    {
        scanf("%d %d",&p[i].x,&p[i].y);
        p[i].id=i;
        p[i].isl=false;
        d.push_back(p[i].y);
    }
    discretize();
    sort(p+1,p+n+1,cmpy);
    for(i=1;i<=n;i+=2)
    {
        if(p[i].y==p[i+1].y)
        {
            p[i].isl=true;
            len+=p[i+1].x-p[i].x;
            merge(p[i].id,p[i+1].id);
        }
    }
    sort(p+1,p+n+1,cmpx);
    for(i=1;i<=n;i+=2)
    {
        if(p[i].x==p[i+1].x)
        {
            len+=p[i+1].y-p[i].y;
            merge(p[i].id,p[i+1].id);
        }
    }
    for(i=2;i<=n;++i)
    {
        if(find(i)!=find(i-1))
        {
            printf("0\n");
            return ;
        }
    }
    for(i=1;i<=n;i+=2)
    {
        idx1=lower_bound(d.begin(),d.end(),p[i].y)-d.begin()+1;
        idx2=lower_bound(d.begin(),d.end(),p[i+1].y)-d.begin()+1;
        if(!p[i].isl)
            update(idx1,-1);
        if(!p[i+1].isl)
            update(idx2,-1);
        if(query(idx2)-query(idx1)!=0)
        {
            printf("0\n");
            return ;
        }
        if(p[i].isl)
            update(idx1,1);
        if(p[i+1].isl)
            update(idx2,1);
    }
    printf("%d\n",len);
}
int main()
{
    work();
}


 

發佈了88 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章