답안 #1023032

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1023032 2024-07-14T08:52:21 Z JakobZorz 송신탑 (IOI22_towers) C++17
0 / 100
2361 ms 36000 KB
#include"towers.h"
#include<vector>
#include<iostream>
using namespace std;

const int TREE_SIZE=1<<17;

int n;
vector<int>arr;
vector<int>thres;
vector<int>prv,nxt;
vector<vector<int>>arr_rmq;
vector<vector<pair<int,int>>>arr_rmq2;
vector<vector<int>>thres_rmq;

void init_prev(){
    prv.resize(n);
    vector<int>s;
    for(int i=0;i<n;i++){
        while(s.size()&&arr[s.back()]>arr[i])
            s.pop_back();
        if(s.empty())
            prv[i]=-1;
        else
            prv[i]=s.back();
        s.push_back(i);
    }
}

void init_nxt(){
    nxt.resize(n);
    vector<int>s;
    for(int i=n-1;i>=0;i--){
        while(s.size()&&arr[s.back()]>arr[i])
            s.pop_back();
        if(s.empty())
            nxt[i]=-1;
        else
            nxt[i]=s.back();
        s.push_back(i);
    }
}

void init_arr_rmq(){
    arr_rmq=vector<vector<int>>(20,vector<int>(n));
    arr_rmq[0]=arr;
    for(int p=1;p<20;p++){
        for(int i=0;i+(1<<p)<=n;i++){
            arr_rmq[p][i]=max(arr_rmq[p-1][i],arr_rmq[p-1][i+(1<<(p-1))]);
        }
    }
}

int get_arr_max(int l,int r){
    int pw2=2;
    int p=0;
    while(pw2<r-l){
        pw2*=2;
        p++;
    }
    pw2/=2;
    return max(arr_rmq[p][l],arr_rmq[p][r-pw2]);
}

void init_thres(){
    thres.resize(n);
    for(int i=0;i<n;i++){
        int mn=2e9;
        
        if(prv[i]!=-1){
            int mx1=get_arr_max(prv[i],i);
            mn=min(mn,mx1);
        }
        
        if(nxt[i]!=-1){
            int mx2=get_arr_max(i,nxt[i]);
            mn=min(mn,mx2);
        }
        
        thres[i]=mn-arr[i];
    }
}

void init_thres_rmq(){
    thres_rmq=vector<vector<int>>(20,vector<int>(n));
    thres_rmq[0]=thres;
    for(int p=1;p<20;p++){
        for(int i=0;i+(1<<p)<=n;i++){
            thres_rmq[p][i]=max(thres_rmq[p-1][i],thres_rmq[p-1][i+(1<<(p-1))]);
        }
    }
}

int get_thres_max(int l,int r){
    int pw2=2;
    int p=0;
    while(pw2<r-l){
        pw2*=2;
        p++;
    }
    pw2/=2;
    return max(thres_rmq[p][l],thres_rmq[p][r-pw2]);
}

void init_arr_rmq2(){
    arr_rmq2=vector<vector<pair<int,int>>>(20,vector<pair<int,int>>(n));
    for(int i=0;i<n;i++)
        arr_rmq2[0][i]={arr[i],i};
    for(int p=1;p<20;p++){
        for(int i=0;i+(1<<p)<=n;i++){
            arr_rmq2[p][i]=min(arr_rmq2[p-1][i],arr_rmq2[p-1][i+(1<<(p-1))]);
        }
    }
}

pair<int,int>get_arr_min(int l,int r){
    int pw2=2;
    int p=0;
    while(pw2<r-l){
        pw2*=2;
        p++;
    }
    pw2/=2;
    return min(arr_rmq2[p][l],arr_rmq2[p][r-pw2]);
}

struct Diff{
    vector<int>arr;
    Diff():arr(TREE_SIZE){}
    
    void update(int i,int x){
        arr[i]=x;
    }
    
    int get(int l,int r){
        int res=0,mx=0;
        for(int i=l;i<r;i++){
            res=max(res,mx-arr[i]);
            mx=max(mx,arr[i]);
        }
        return res;
    }
};

Diff diff1,diff2;

void init(int N,vector<int>H){
    arr=H;
    n=(int)arr.size();
    init_prev();
    init_nxt();
    init_arr_rmq();
    init_thres();
    init_thres_rmq();
    init_arr_rmq2();
    for(int i=0;i<n;i++){
        diff1.update(i,arr[i]);
        diff2.update(i,-arr[i]);
    }
}

int max_towers(int L,int R,int D){
    int res=0;
    for(int i=L;i<=R;i++){
        if(thres[i]>=D){
            res++;
        }
    }
    
    int first=-1,last=-1;
    if(get_thres_max(L,R+1)<D){
        first=get_arr_min(L,R+1).second;
        last=first;
        res=1;
    }else{
        {
            int l=L,r=R+1;
            while(l<r-1){
                int mid=(l+r)/2;
                if(get_thres_max(L,mid)>=D)
                    r=mid;
                else
                    l=mid;
            }
            first=l;
        }
        
        {
            int l=L,r=R+1;
            while(l<r-1){
                int mid=(l+r)/2;
                if(get_thres_max(mid,R+1)>=D)
                    l=mid;
                else
                    r=mid;
            }
            last=l;
        }
    }
    
    if(get_arr_max(L,first)>=arr[first]+D){
        int l=L,r=first;
        while(l<r-1){
            int mid=(l+r)/2;
            if(get_arr_max(mid,first)>=arr[first]+D)
                l=mid;
            else
                r=mid;
        }
        res+=diff2.get(L,l+1)>=D;
    }
    
    if(get_arr_max(last,R+1)>=arr[last]+D){
        int l=last,r=R+1;
        while(l<r-1){
            int mid=(l+r)/2;
            if(get_arr_max(last,mid)>=arr[last]+D)
                r=mid;
            else
                l=mid;
        }
        res+=diff1.get(l,R+1)>=D;
    }
    
    return res;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1256 ms 22296 KB 2nd lines differ - on the 1st token, expected: '1', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 1624 KB 1st lines differ - on the 1st token, expected: '13', found: '14'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 1624 KB 1st lines differ - on the 1st token, expected: '13', found: '14'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2361 ms 36000 KB 1st lines differ - on the 1st token, expected: '11903', found: '11904'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 735 ms 9816 KB 1st lines differ - on the 1st token, expected: '7197', found: '7198'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 1624 KB 1st lines differ - on the 1st token, expected: '13', found: '14'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1256 ms 22296 KB 2nd lines differ - on the 1st token, expected: '1', found: '2'
2 Halted 0 ms 0 KB -