#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
int n;
struct mina
{
long long z, p, pp, kk;
};
map<int, map<int, long long>> cashe;
mina t[300005];
long long solve(int pz, int dnd)
{
if (pz > n)
return 1;
if (cashe.find(dnd) != cashe.end() && cashe[dnd].find(pz) != cashe[dnd].end())
{
return cashe[dnd][pz];
}
else
{
long long wyn = 0;
wyn += solve(pz + 1, pz);
if (t[pz].pp > dnd)
{
wyn += solve(t[pz].kk + 1, dnd);
}
wyn %= mod;
cashe[dnd][pz] = wyn;
// cout<<pz<<' '<<dnd<<' '<<wyn<<'\n';
return wyn;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> t[i].p >> t[i].z;
}
for (int i = n; i > 0; i--)
{
long long zas = t[i].p + t[i].z;
for (int j = i; j <= n; j++)
{
if (t[j].p > zas)
break;
t[i].kk = j;
if (t[j].p + t[j].z > zas)
{
t[i].kk = t[j].kk;
}
}
// cout<<t[i].kk<<' ';
}
for (int i = 1; i <= n; i++)
{
long long zas = t[i].p - t[i].z;
for (int j = i; j > 0; j--)
{
if (t[j].p < zas)
break;
t[i].pp = j;
if (t[j].p - t[j].z < zas)
{
t[i].pp = t[j].pp;
}
}
// cout<<t[i].pp<<' ';
// cout<<t[i].pp<<' '<<t[i].kk<<'\n';
}
// cout<<'\n';
bool e = true;
while (e)
{
// cout<<"a";
e = false;
for (int i = n ; i > 0; i--)
{
for (int j = i + 1; j <= n; j++)
{
if (j > t[i].kk)break;
if (t[j].pp < t[i].pp)e = true;
t[i].pp = min(t[i].pp, t[j].pp);
if(t[j].kk>t[i].kk){
e=true;
t[i].kk=t[j].kk;
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = i - 1; j > 0; j--)
{
if (j < t[i].pp)break;
if(t[j].pp<t[i].pp){
e=true;
t[i].pp=t[j].pp;
}
if (t[j].kk > t[i].kk)
{
e = true;
t[i].kk = t[j].kk;
}
}
// cout<<t[i].pp<<' '<<t[i].kk<<'\n';
}
// cout<<'\n';
}
//
cout << solve(1, 0);
}
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <bits/stdc++.h> using namespace std; const int mod = 1000000007; int n; struct mina { long long z, p, pp, kk; }; map<int, map<int, long long>> cashe; mina t[300005]; long long solve(int pz, int dnd) { if (pz > n) return 1; if (cashe.find(dnd) != cashe.end() && cashe[dnd].find(pz) != cashe[dnd].end()) { return cashe[dnd][pz]; } else { long long wyn = 0; wyn += solve(pz + 1, pz); if (t[pz].pp > dnd) { wyn += solve(t[pz].kk + 1, dnd); } wyn %= mod; cashe[dnd][pz] = wyn; // cout<<pz<<' '<<dnd<<' '<<wyn<<'\n'; return wyn; } } int main() { ios_base::sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> t[i].p >> t[i].z; } for (int i = n; i > 0; i--) { long long zas = t[i].p + t[i].z; for (int j = i; j <= n; j++) { if (t[j].p > zas) break; t[i].kk = j; if (t[j].p + t[j].z > zas) { t[i].kk = t[j].kk; } } // cout<<t[i].kk<<' '; } for (int i = 1; i <= n; i++) { long long zas = t[i].p - t[i].z; for (int j = i; j > 0; j--) { if (t[j].p < zas) break; t[i].pp = j; if (t[j].p - t[j].z < zas) { t[i].pp = t[j].pp; } } // cout<<t[i].pp<<' '; // cout<<t[i].pp<<' '<<t[i].kk<<'\n'; } // cout<<'\n'; bool e = true; while (e) { // cout<<"a"; e = false; for (int i = n ; i > 0; i--) { for (int j = i + 1; j <= n; j++) { if (j > t[i].kk)break; if (t[j].pp < t[i].pp)e = true; t[i].pp = min(t[i].pp, t[j].pp); if(t[j].kk>t[i].kk){ e=true; t[i].kk=t[j].kk; } } } for (int i = 1; i <= n; i++) { for (int j = i - 1; j > 0; j--) { if (j < t[i].pp)break; if(t[j].pp<t[i].pp){ e=true; t[i].pp=t[j].pp; } if (t[j].kk > t[i].kk) { e = true; t[i].kk = t[j].kk; } } // cout<<t[i].pp<<' '<<t[i].kk<<'\n'; } // cout<<'\n'; } // cout << solve(1, 0); } |
English