找到可行区间,最优解一定在区间的下端点。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500500
using namespace std;
int n,X,x[maxn],a[maxn],b[maxn],l[maxn],r[maxn],ans=0;
int read()
{
    char ch;int data=0,f=1;
    while (ch<'0' || ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0' && ch<='9')
    {
        data=data*10+ch-'0';
        ch=getchar();
    }
    return data*f;
}
int main()
{
    n=read();X=read();
    for (int i=1;i<=n;i++)
        x[i]=read(),a[i]=read(),b[i]=read();
    l[0]=r[0]=0;
    for (int i=1;i<=n;i++)
    {
        l[i]=max(l[i-1]-(x[i]-x[i-1]),a[i]+1);
        r[i]=min(r[i-1]+(x[i]-x[i-1]),b[i]-1);
        if (l[i]>r[i]) {printf("NIE\n");return 0;}
    }
    int ret=0;
    for (int i=1;i<=n;i++)
    {
        if (x[i]>X) break;
        int now=x[i]-x[i-1]+l[i]-ret;
        if (now%2) {l[i]++;now++;}
        if (l[i]>r[i]) {printf("NIE\n");return 0;}
        if (now>0) ans+=now/2;ret=l[i];
    }
    printf("%d\n",ans);
    return 0;
}