题面:link
网上尽是SB线段树
单调站你怎么你了?
#include <bits/stdc++.h>
#define ll long long
#define rll register ll
#define cll const ll
#define N 100005
using namespace std;
inline ll read()
{
rll x=0;bool f=1;register char c=getchar();
while(c<48||c>57){if(c=='-') f=0;c=getchar();}
while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
return f?x:-x;
}
inline void write(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+48);
}
cll n=read(),s=read();
ll top1,top2,l[N],r[N],s1[N],s2[N],nxt1[N],nxt2[N],f[N][2];
int main()
{
for(rll i=1;i<=n;i++)
l[i]=read(),r[i]=read();
for(rll i=n;i>=1;i--)
{
while(top1&&l[s1[top1]]>=l[i]&&l[s1[top1]]<=r[i])
nxt1[s1[top1--]]=i;
while(top2&&r[s2[top2]]>=l[i]&&r[s2[top2]]<=r[i])
nxt2[s2[top2--]]=i;
s1[++top1]=i,s2[++top2]=i;
}
for(rll i=1;i<=n;i++)
{
// cout << "pos=" << nxt1[i] << ' ' << nxt2[i] << '\n';
f[i][0]=min(f[nxt1[i]][0]+abs(l[i]-l[nxt1[i]]),f[nxt1[i]][1]+abs(l[i]-r[nxt1[i]]));
f[i][1]=min(f[nxt2[i]][0]+abs(r[i]-l[nxt2[i]]),f[nxt2[i]][1]+abs(r[i]-r[nxt2[i]]));
}
write(min(f[n][0]+abs(s-l[n]),f[n][1]+abs(s-r[n])));
return 0;
}
重点:求调