#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; //mt19937 mrand(random_device{}()); const ll mod=1000000007; //int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=501000; ll a[N],r[N]; int stk[N],L[N],R[N],n,dp[N]; int c[N]; VI dis[N]; int main() { scanf("%d",&n); rep(i,1,n+1) scanf("%lld%lld",a+i,r+i); a[0]=-(1ll<<60); a[n+1]=(1ll<<61); r[0]=r[n+1]=(1ll<<62); int t=0; stk[t++]=n+1; per(i,1,n+1) { auto eval=[&](int i) {return a[i]-r[i]; } ; int l=0,r=t; while (l+1<r) { int md=(l+r)>>1; if (eval(stk[md])<=a[i]) l=md; else r=md; } R[i]=stk[l]; while (t>0&&eval(i)<=eval(stk[t-1])) --t; stk[t++]=i; } t=0; stk[t++]=0; rep(i,1,n+1) { auto eval=[&](int i) {return a[i]+r[i];} ; int l=0,r=t; while (l+1<r) { int md=(l+r)>>1; if (eval(stk[md])>=a[i]) l=md; else r=md; } L[i]=stk[l]; while (t>0&&eval(i)>=eval(stk[t-1])) --t; stk[t++]=i; } R[0]=n+1; L[n+1]=0; dp[0]=1; rep(i,0,n+1) { dis[R[i]].pb(i); } auto modify=[&](int x,int s) { for (;x<=n+2;x+=x&-x) c[x]=(c[x]+s)%mod; }; auto query=[&](int x) { int s=0; for (;x;x-=x&-x) s=(c[x]+s)%mod; return s; }; modify(1,dp[0]); rep(i,1,n+2) { dp[i]=(query(i)-query(L[i]))%mod; for (auto x:dis[i]) modify(x+1,-dp[x]); modify(i+1,dp[i]); } if (dp[n+1]<0) dp[n+1]+=mod; printf("%d\n",dp[n+1]); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; //mt19937 mrand(random_device{}()); const ll mod=1000000007; //int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=501000; ll a[N],r[N]; int stk[N],L[N],R[N],n,dp[N]; int c[N]; VI dis[N]; int main() { scanf("%d",&n); rep(i,1,n+1) scanf("%lld%lld",a+i,r+i); a[0]=-(1ll<<60); a[n+1]=(1ll<<61); r[0]=r[n+1]=(1ll<<62); int t=0; stk[t++]=n+1; per(i,1,n+1) { auto eval=[&](int i) {return a[i]-r[i]; } ; int l=0,r=t; while (l+1<r) { int md=(l+r)>>1; if (eval(stk[md])<=a[i]) l=md; else r=md; } R[i]=stk[l]; while (t>0&&eval(i)<=eval(stk[t-1])) --t; stk[t++]=i; } t=0; stk[t++]=0; rep(i,1,n+1) { auto eval=[&](int i) {return a[i]+r[i];} ; int l=0,r=t; while (l+1<r) { int md=(l+r)>>1; if (eval(stk[md])>=a[i]) l=md; else r=md; } L[i]=stk[l]; while (t>0&&eval(i)>=eval(stk[t-1])) --t; stk[t++]=i; } R[0]=n+1; L[n+1]=0; dp[0]=1; rep(i,0,n+1) { dis[R[i]].pb(i); } auto modify=[&](int x,int s) { for (;x<=n+2;x+=x&-x) c[x]=(c[x]+s)%mod; }; auto query=[&](int x) { int s=0; for (;x;x-=x&-x) s=(c[x]+s)%mod; return s; }; modify(1,dp[0]); rep(i,1,n+2) { dp[i]=(query(i)-query(L[i]))%mod; for (auto x:dis[i]) modify(x+1,-dp[x]); modify(i+1,dp[i]); } if (dp[n+1]<0) dp[n+1]+=mod; printf("%d\n",dp[n+1]); } |