这道题的思想是 将其线段化,根据相邻线段的区间进行取舍,再就是用到two pointer算法。
还没写出来,以后再写,太麻烦了。日后调试之。
http://codeforces.com/contest/384/problem/D
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
typedef struct node
{
int x,y;
}node;
typedef struct Edge
{
int start,end;
}Edge;
node arr[100010];
Edge edge[100010];
Edge copy[100010];
int n,m,k,count;
int cmp(const void *a,const void *b)
{
node aa,bb;
aa = *(node *)a,bb = *(node *)b;
if(aa.x != bb.x) return aa.x - bb.x;
return aa.y - bb.y;
}
void cp()
{
int i;
for(i = 0,k = count;i < count;i ++)
edge[i].start = copy[i].start,edge[i].end = copy[i].end;
}
int cal()
{
int i,j,row,left,right,flag;
edge[0].start = 1,edge[0].end = arr[0].y - 1;
for(i = 0;i < m;i ++) if(arr[i].x != 1) break;
row = arr[0].x;left = 0;
for(count = j = 0;j < k,i < m;)
{
if(k == 0) return -1;
flag = 0;
if(arr[i].x != row)
{
if(arr[i-1].y != n && arr[i-1].x != 1){right = n;flag = 1;}
else {if(arr[i-1].x != 1)cp();j = 0;left= 0,right = arr[i].y - 1;}
}
else right = arr[i].y - 1;
if(right == left){left += 1;i += 1;}
else
{
left += 1;
if(right < edge[j].start)
{
left = right+1;
if(flag){cp();j = 0; left = 0,right = arr[i].y - 1;}
else i ++;
}
else if(left <= edge[j].start && right >= edge[j].start &&right <= edge[j].end)
{
copy[count].start = edge[j].start,copy[count++].end = right;
left = right + 1;
if(flag){cp();j = 0; left = 0,right = arr[i].y - 1;}
else i ++;
}
else if(left >= edge[j].start && right <= edge[j].end)
{
copy[count].start = left;copy[count++].end = right;left = right + 1;
if(flag){cp(); j = 0;left = 0,right = arr[i].y - 1;}
else i ++;
}
else if(left <= edge[j].start &&right >= edge[j].end)
{
copy[count].start = edge[j].start;copy[count++].end = right;j ++;
}
else if(left >= edge[j].start && left <= edge[j].end && right >= edge[j].end)
{
copy[count].start = left;copy[count++].end = right;j += 1;
}
else if(left > edge[j].end){if(flag) cp,j = 0; else j ++;}
}
}
return 1;
}
void judge()
{
if(k == 0)printf("-1\n");
else if(edge[k-1].end == n) printf("%d\n",2*(n-1));
else puts("-1");
}
int main()
{
int i;
while(~scanf("%d%d",&n,&m))
{
for(i = 0;i < m;i ++) scanf("%d%d",&arr[i].x,&arr[i].y);
qsort(arr,m,sizeof(node),cmp);
k = 1;
if(cal() == -1)printf("-1\n");
else judge();
}
return 0;
}