#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); } |