#include<iostream> #include<stdio.h> using namespace std; typedef long long ll; const int N=1e5+10; int dp[N]; int x[85],r[85]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1; i<=n; ++i) { scanf("%d%d",x+i,r+i); } dp[m+1]=0; for(int i=m; i>=1; --i) { int pos=i; dp[i]=1+dp[i+1];//从右往左 for(int j=1; j<=n; ++j) { int _x=x[j],_r=r[j]; if(_x>=pos) {//如果在某个天线的左边 if(_x-_r<=pos) {//如果在天线的覆盖范围之内 dp[i]=min(dp[i],dp[min(m+1,_x+_r+1)]);//就不用花费,往前面倒腾,而且不能出界 } else {//如果不在覆盖范围之内 dp[i]=min(dp[i],_x-_r-pos+dp[min(m+1,2*_x-pos+1)]);//扩展距离的费用 + 原本需要花费的钱 //_x-(pos-x) 也是往前倒腾 因为往左扩展的同时也会往右扩展 //而此时左边还没有赋值,就往前 } } else {//如果在某个天线的右边 if(_x+_r>=pos) {//如果在范围之内 dp[i]=min(dp[i],dp[min(m+1,_x+_r+1)]);//同理,往前搞 } //在右边的情况不用讨论,因为它一定会在某个天线的右边 //当位于最右边且且覆盖不的时候,第19行已经进行了处理 } } } printf("%d ",dp[1]); } /* dp[m+1]=0,我们接下来从大到小遍历pos pospos,来求出dp[] dp[]dp[],假设现在要求dp[pos] dp[pos]dp[pos],那么我们枚举所有的电线杆 dp[pos]=1+dp[pos+1] dp[pos]=1+dp[pos+1]dp[pos]=1+dp[pos+1],代表从x-1位置扩展到x 当Xi>=pos,且Xi-ri<=pos,则dp[pos]=min(dp[pos],dp[min(xi+ri+1,m+1)]) 要判段是否出界 当Xi>=pos,且Xi-ri>pos ,dp[pos]=min(dp[pos],xi-ri-pos+dp[min(2*xi-pos+1,m+1)]) 当xi<pos,且xi+ri>=pos,则dp[pos]=min(dp[pos],dp[min(xi+ri+1,m+1)]) 当xi<pos,且xi+ri<pos,则不用当前 antenna扩展 */