Submission #825152

#TimeUsernameProblemLanguageResultExecution timeMemory
825152alvingogo송신탑 (IOI22_towers)C++17
23 / 100
4099 ms8116 KiB
#include "towers.h"
#include <bits/stdc++.h>
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

struct ST{
    vector<int> st;
    void init(int x){
        st.resize(4*x);
    }
    void update(int v,int L,int R,int p,int k){
        if(L==R){
            st[v]=k;
            return;
        }
        int m=(L+R)/2;
        if(p<=m){
            update(2*v+1,L,m,p,k);
        }
        else{
            update(2*v+2,m+1,R,p,k);
        }
        st[v]=max(st[2*v+1],st[2*v+2]);
    }
    int query(int v,int L,int R,int l,int r){
        if(l>r){
            return 0;
        }
        if(L==l && r==R){
            return st[v];
        }
        int m=(L+R)/2;
        if(r<=m){
            return query(2*v+1,L,m,l,r);
        }
        else if(l>m){
            return query(2*v+2,m+1,R,l,r);
        }
        else{
            return max(query(2*v+1,L,m,l,m),query(2*v+2,m+1,R,m+1,r));
        }
    }
};
vector<int> v;
int mx;
int n;
void init(int N, vector<int> h) {
    v=h;
    n=N;
}

int max_towers(int l, int r, int d) {
    ST st;
    st.init(n);
    vector<int> a(n,l);
    set<pair<int,int> > s;
    for(int i=r;i>=l;i--){
        while(s.size()){
            auto h=*s.begin();
            if(h.fs+d<=v[i]){
                a[h.sc]=i;
                s.erase(h);
            }
            else{
                break;
            }
        }
        s.insert({v[i],i});
    }
    vector<int> dp(n);
    s.clear();
    int ans=0;
    for(int i=l;i<=r;i++){
        while(s.size()){
            auto h=*s.begin();
            if(h.fs+d<=v[i]){
                st.update(0,0,n-1,h.sc,dp[h.sc]);
                s.erase(h);
            }
            else{
                break;
            }
        }
        dp[i]=st.query(0,0,n-1,l,a[i]-1)+1;
        s.insert({v[i],i});
        ans=max(ans,dp[i]);
    }
    return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...