제출 #1286183

#제출 시각아이디문제언어결과실행 시간메모리
1286183dssfsuper2Bouquet (EGOI24_bouquet)C++20
100 / 100
46 ms7512 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
using pii = pair<int, int>;
struct Ftm {
    vector<int> bit;
    int n;
    const int INF = 0;
    Ftm(int n) {
        this->n = n;
        bit.assign(n, INF);
    }
    int getmax(int r) {
        int ret = INF;
        for (; r >= 0; r = (r & (r + 1)) - 1)
            ret = max(ret, bit[r]);
        return ret;
    }
    void update(int idx, int val) {
        for (; idx < n; idx = idx | (idx + 1))
            bit[idx] = max(bit[idx], val);
    }
};
void solve(){
    int n;cin>>n;
    Ftm mn(n+1);
    vector<pii> a={{0, 0}};
    for(int i = 1;i<=n;i++){
        int x, y;cin>>x>>y;
        a.push_back({max(1, i-x), min(n, i+y)});
    }
    vector<int> reses={0};
    int res=0;
    priority_queue<pii, vector<pii>, greater<pii>> pq={};
    for(int i =1;i<=n;i++){
        while(!pq.empty() && pq.top().first<i){
            mn.update(pq.top().second, reses[pq.top().second]);
            pq.pop();
        }
        reses.push_back(1+mn.getmax(a[i].first-1));
        res=max(res, reses.back());
        pq.push({a[i].second, i});
    }
    cout << res << '\n';
}
signed main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    int T=1;//cin>>T;
    while(T--)solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...