SGU128 Snake

来源:互联网 发布:mac破解软件首发论坛 编辑:程序博客网 时间:2024/05/18 02:01

注意:用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();}