求HACK
  • 板块CF383B Volcanoes
  • 楼主djwj323
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/2/28 15:57
  • 上次更新2023/10/28 07:32:00
查看原帖
求HACK
212320
djwj323楼主2022/2/28 15:57
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<set>
using namespace std;
struct node{
	long long x,y;
}__,w[2000003],p[2000003],_[2000003];
long long n,m,l,r,t,lo,ans,sum,s,i,j,k;
bool cmp(node a,node b)
{
	if(a.x==b.x)  return a.y<b.y;
	return a.x<b.x;
}
int main()
{
	//freopen("rebuildglory.in","r",stdin),freopen("rebuildglory.out","w",stdout);
	for(scanf("%lld%lld",&n,&m),i=1;i<=m;i++)  scanf("%lld%lld",&w[i].x,&w[i].y);
	sort(w+1,w+m+1,cmp),t=1,p[1].x=1,p[1].y=1;
	for(i=1;i<=m;)
	{
		j=i,sum=0;
		while(w[i].x==w[j+1].x&&j<m)  j++;
		if(w[i].x-lo>1)  t=1,p[1].y=n;
		for(s=0,k=i;k<=j;k++)
		{
			if(w[k].y==s+1)
			{
				s=w[k].y;
				continue;
			}
			l=1,r=t,ans=-1,__.x=1e10,__.y=w[k].y;
			while(l<=r)
			{
				if(p[(l+r)/2].y>s)  ans=(l+r)/2,r=(l+r)/2-1;
				else  l=(l+r)/2+1;
			}
			if(ans!=-1&&p[ans].y<w[k].y)  __.x=min(__.x,max(p[ans].x,s+1));
			l=1,r=t,ans=-1;
			while(l<=r)
			{
				if(p[(l+r)/2].x>s)  ans=(l+r)/2,r=(l+r)/2-1;
				else  l=(l+r)/2+1;
			}
			if(ans!=-1&&p[ans].x<w[k].y)  __.x=min(__.x,p[ans].x);
			s=__.y;
			if(__.x!=1e10)  __.y--,_[++sum]=__;
		}
		if(s<n)
		{
			l=1,r=t,ans=-1,__.x=1e10,__.y=n;
			while(l<=r)
			{
				if(p[(l+r)/2].y>s)  ans=(l+r)/2,r=(l+r)/2-1;
				else  l=(l+r)/2+1;
			}
			if(ans!=-1&&p[ans].y<=n)  __.x=min(__.x,max(p[ans].x,s+1));
			l=1,r=t,ans=-1;
			while(l<=r)
			{
				if(p[(l+r)/2].x>s)  ans=(l+r)/2,r=(l+r)/2-1;
				else  l=(l+r)/2+1;
			}
			if(ans!=-1&&p[ans].x<=n)  __.x=min(__.x,p[ans].x);
			if(__.x!=1e10)  _[++sum]=__;
		}
		for(t=sum,k=1;k<=t;k++)  p[k]=_[k];
		if(t==0)  return printf("-1"),0;
		lo=w[i].x,i=j+1;
	}
	if(lo!=n)  return printf("%lld",n*2-2),0;
	if(p[t].y==n)  return printf("%lld",n*2-2),0;
	return printf("-1"),0;
}
2022/2/28 15:57
加载中...