怎么说呢,这个题很皮,如果我能早点找出bug,就能进入决赛了,菜的抠脚,一开始就想到了对的思路,开始的代码也是对的不行,对边缘测试数据的没想到,和另一个点的没想到,爆炸的找bug就是找不到,想到了昨天和黄总下象棋,每次都是怎么失误的呢,就是陷入僵局后,就是那种牵一发动全身的僵局,去看另外的棋子,然后回来看的时候很多坑都会忘记,然后就随意的动了一发棋子,以为自己占了便宜,然后,自己忘了这个棋子不动能牵制很多东西,然后陷入GG。
所以这个也是开始想到了取最右面的,但是一转头忘了,没继续去思考,写每一段代码时要进行思考,测试数据一定要有边缘测试。考虑到自己最边缘的情况,不要不去想。去想比懒得想会节约很多时间,减少很多错误。
不愤不启,不悱不发,举一隅不以三隅反,则不复也。
#include<algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
struct node
{
int l,r;
} a[100005],b[100005];
bool cmp(node a,node b)
{
if(a.l==b.l)return a.r<b.r;
return a.l<b.l;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<n; i++)
scanf("%d%d",&a[i].l,&a[i].r);
sort(a,a+n,cmp);
b[0].l=a[0].l;
b[0].r=a[0].r;
int N=0;
for(int i=1; i<n; i++)
{
if((a[i].l-1)<=b[N].r)b[N].r=max(a[i].r,b[N].r);//没加max
else
{
N++;
b[N].l=a[i].l;
b[N].r=a[i].r;
}
}
int tmp=0;
tmp=b[0].r-b[0].l+1;
int l=0,cnt=0;//cnt是m,l是开始的
int maxn=m;
maxn=max(tmp+m,maxn);//tmp没加m,大神一眼就能看到
for(int i=1; i<=N; i++)
{
if(l>=i)
{
// printf("%d %d %d\n",tmp,cnt,i);
tmp=(b[i].r-b[i].l+1);
cnt=0;
maxn=max(tmp+m,maxn);
continue;
}
cnt+=(b[i].l-b[i-1].r-1);
tmp+=(b[i].r-b[i-1].r);
if(cnt>m)
{
tmp-=(b[i].r-b[i-1].r);
cnt-=(b[i].l-b[i-1].r-1);
l++;
tmp-=(b[l].l-b[l-1].l);
cnt-=(b[l].l-b[l-1].r-1);
i--;
//printf("%d %d\n",l,i);
}
maxn=max(tmp+m-cnt,maxn);
}
if(cnt<=m)maxn=max(m-cnt+tmp,maxn);
printf("%d\n",maxn);
}
return 0;
}