**题
  • 板块灌水区
  • 楼主wxzzzz
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/3 12:42
  • 上次更新2023/12/3 15:19:36
查看原帖
**题
749630
wxzzzz楼主2023/12/3 12:42

题面: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;
}

重点:求调

2023/12/3 12:42
加载中...