作为一个签到题我居然写了半天。。。自己好弱啊
思路:因为就200个数据,那我们每次输入用结构体记录一下,然后去sort排序,按照最左端由小到大排序。每次插入后sort一遍维护一下即可,每次把存入的值记录下来!
每种情况需要重新向前找的为该段包含某段! 该段头或尾在某段中弱就是没有考虑到第一种情况一直WA,然后模拟一下XJBG即可
代码小丑请海涵
#include<bits/stdc++.h>
#define input freopen("input.txt","r",stdin)
using namespace std;
typedef struct node
{
long long start,end;
}node;
node a[205];
int cmp(node s1,node s2)
{
if(s1.start<=s2.start)return 1;
return 0;
}
long long value[205][2];
int main()
{
//input;
int n,len,i,j;
long long s,l,e;
while(scanf("%d",&n)!=EOF)
{
a[0].start=-1;
a[0].end=0;
a[1].start=(long long)1e15;
a[1].end=(long long)1e15;
len=1;
for(i=1;i<=n;i++)
{
scanf("%I64d%I64d",&s,&l);
e=s+l-1;
int flag=1;
for(j=0;j<=len;j++)
{
if((s>=a[j].start&&s<=a[j].end)||(e>=a[j].start&&e<=a[j].end)||((s<a[j].start&&e>a[j].end)))
{
flag=0;
break;
}
}
if(flag==1)
{
value[len][0]=s;
value[len][1]=e;
a[++len].start=s;
a[len].end=e;
}
else
{
for(j=0;j<len;j++)
{
if(a[j+1].start-a[j].end-1>=l)
{
value[len][0]=a[j].end+1;
value[len][1]=a[j].end+l;
a[++len].start=a[j].end+1;
a[len].end=a[j].end+l;
break;
}
}
}
sort(a+1,a+len+1,cmp);
}
for(i=1;i<len;i++)
{
cout<<value[i][0]<<" "<<value[i][1]<<endl;
}
}
return 0;
}