제출 #373962

#제출 시각아이디문제언어결과실행 시간메모리
373962FEDIKUSFountain (eJOI20_fountain)C++17
100 / 100
578 ms51296 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define xx first
#define yy second
#define pb push_back

using namespace std;

typedef long long ll;
typedef pair<ll,ll> pii;

vector<ll> sparsemax[19];
vector<ll> logovi;
vector<vector<ll> > g;
vector<ll> tren;
vector<ll> lift[19];
vector<ll> sume;
vector<bool> bio;
vector<pii> niz;

ll query(ll l,ll r){
    //cout<<l<<" "<<r<<" "<<logovi[r-l+1]<<" "<<l+(1<<logovi[r-l+1])<<" "<<max(sparsemax[logovi[r-l+1]][r],sparsemax[logovi[r-l+1]][l+(1<<logovi[r-l+1])-1])<<"\n";
    return max(sparsemax[logovi[r-l+1]][r],sparsemax[logovi[r-l+1]][l+(1<<logovi[r-l+1])-1]);
}

void dfs(ll cvor,ll sum){
    if(bio[cvor]) return;
    //cout<<cvor<<endl;
    sum+=niz[cvor].yy;
    //cout<<cvor<<" "<<niz[cvor].yy<<" "<<sum<<"\n";
    bio[cvor]=true;
    tren.push_back(cvor);
    for(ll i:g[cvor]){
        if(bio[i]) continue;
        dfs(i,sum);
    }
    //cout<<"proso"<<endl;
    for(ll i=0;i<19;i++){
        if((1<<i)>=tren.size()) {lift[i][cvor]=-1; continue;}
        lift[i][cvor]=tren[(ll)tren.size()-((ll)1<<i)-1];
    }

    sume[cvor]=sum;
    tren.pop_back();
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll n,q;
    cin>>n>>q;
    niz.resize(n+1);
    niz[n]=mp(1e9+1,1e9+1);
    for(ll i=0;i<n;i++) {cin>>niz[i].xx>>niz[i].yy;}
    logovi.resize(n+1);
    ll sta=-1;
    ll tren=1;
    for(ll i=1;i<=n;i++){
        if(tren==i){
            tren=2*i;
            sta++;
        }
        logovi[i]=sta;
    }
    g.resize(n+1);
    for(ll i=0;i<19;i++){
        sparsemax[i].resize(n+1);
        for(ll j=(1<<i)-1;j<=n;j++){
            if(i==0) sparsemax[i][j]=niz[j].xx;
            else{
                sparsemax[i][j]=max(sparsemax[i-1][j],sparsemax[i-1][j-((ll)1<<(i-1))]);
                //cout<<i<<" "<<j<<" "<<sparsemax[i][j]<<endl;
            }
        }
    }
    for(ll i=0;i<n;i++){
        ll l=i;
        ll r=n;
        ll naj=-1;
        while(l<=r){
            ll mid=l+(r-l)/2;
            //cout<<i<<" "<<mid<<" "<<query(i+1,mid)<<endl;
            if(query(i,mid)>niz[i].xx){
                naj=mid;
                r=mid-1;
            }else l=mid+1;
        }
        //cout<<i<<" "<<naj<<endl;
        g[i].pb(naj);
        g[naj].pb(i);
    }
    sume.resize(n+1);
    bio.resize(n+1,false);
    for(ll i=0;i<19;i++) lift[i].resize(n+1);
    dfs(n,0);
    //for(ll i=0;i<=n;i++) cout<<sume[i]<<" ";
    while(q--){
        ll r,v;
        cin>>r>>v;
        r--;
        ll tren=r;
        for(ll i=18;i>=0;i--){
            if(lift[i][tren]==-1) continue;
            if(sume[r]-sume[lift[i][tren]]>=v) continue;
            tren=lift[i][tren];
        }
        if(tren==n) cout<<0<<"\n";
        else cout<<tren+1<<"\n";
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

fountain.cpp: In function 'void dfs(ll, ll)':
fountain.cpp:39:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |         if((1<<i)>=tren.size()) {lift[i][cvor]=-1; continue;}
      |            ~~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...