답안 #955008

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
955008 2024-03-29T06:59:19 Z StefanSebez 3단 점프 (JOI19_jumps) C++14
0 / 100
158 ms 36172 KB
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define pb push_back
const int N=5*1e5+50,inf=1e9;
int a[N];
int root,nc,lc[2*N],rc[2*N],maks[2*N],maks1[2*N],maksu[2*N],lazy[2*N];
void Build(int &c,int ss,int se){
    c=++nc;
    maks[c]=lazy[c]=-inf;
    if(ss==se){
        maks1[c]=a[ss];
        maksu[c]=maks1[c];
        return;
    }
    int mid=(ss+se)/2;
    Build(lc[c],ss,mid);
    Build(rc[c],mid+1,se);
    maks1[c]=max(maks1[lc[c]],maks1[rc[c]]);
    maksu[c]=maks1[c];
}
void update(int c,int qval){
    lazy[c]=max(lazy[c],qval);
    maks[c]=max(maks[c],qval);
    maksu[c]=max(maksu[c],maks1[c]+qval);
}
void push(int c){
    update(lc[c],lazy[c]);
    update(rc[c],lazy[c]);
    lazy[c]=-inf;
}
void Update(int c,int ss,int se,int qs,int qe,int qval){
    //if(!c) c=++nc;
    if(qs>qe) return;
    if(qs<=ss && se<=qe){
        update(c,qval);
        //printf("%i %i %i: %i %i %i\n",c,ss,se,maks[c],maks1[c],maksu[c]);
        return;
    }
    if(qe<ss || se<qs) return;
    int mid=(ss+se)/2;
    push(c);
    Update(lc[c],ss,mid,qs,qe,qval);
    Update(rc[c],mid+1,se,qs,qe,qval);
    maks[c]=max(maks[lc[c]],maks[rc[c]]);
    maksu[c]=max(maksu[lc[c]],maksu[rc[c]]);
    //printf("%i %i %i: %i %i %i\n",c,ss,se,maks[c],maks1[c],maksu[c]);
}
int Get(int c,int ss,int se,int qs,int qe){
    //printf("%i %i: %i %i %i %i\n",ss,se,maks[c],maks1[c],maksu[c],lazy[c]);
    if(qs<=ss && se<=qe) {
        return maksu[c];
    }
    if(qe<ss || se<qs) return -inf;
    int mid=(ss+se)/2;
    push(c);
    return max(Get(lc[c],ss,mid,qs,qe),Get(rc[c],mid+1,se,qs,qe));
}
int main()
{
    int n;scanf("%i",&n);
    for(int i=1;i<=n;i++)scanf("%i",&a[i]);
    int Q;scanf("%i",&Q);pair<pair<int,int>,int>Qs[Q+10];
    for(int i=1;i<=Q;i++) {scanf("%i%i",&Qs[i].fi.fi,&Qs[i].fi.se);Qs[i].se=i;}
    vector<int>mono;
    vector<int>R[n+10];
    for(int i=1;i<=n;i++){
        while(mono.size() && a[mono.back()]<=a[i]){
            R[mono.back()].pb(i);
            mono.pop_back();
        }
        mono.pb(i);
    }
    mono.clear();
    for(int i=1;i<=n;i++){
        while(mono.size() && a[mono.back()]>a[i]){
            R[mono.back()].pb(i);mono.pop_back();
        }
        mono.pb(i);
    }
    //printf("*\n");
    //for(int i=1;i<=n;i++) for(auto j:R[i]) printf("%i %i\n",i,j);
    /*vector<int>R[n+10];
    for(int i=1;i<=n;i++){
        //printf("%i: ",i);
        //int mx=a[i];
        for(int j=i+1;j<=n;j++){
            //mx=max(mx,a[j]);
            int mx=0;
            for(int k=i+1;k<j;k++){
                mx=max(mx,a[k]);
            }
            if(mx<a[i] && mx<a[j]) R[i].pb(j);//printf("%i ",R[i].back());}
        }
        //printf("\n");
    }*/
    Build(root,1,n);
    int res[Q+10]={0};
    sort(Qs+1,Qs+Q+1);
    for(int i=n,j=Q;i>=1;i--){
        for(auto j:R[i]){//if(R[i]!=0){
            //a=i,b=R[i], b-a<=c-b, 2b-a=2R[i]-i<=c
            if(2*j-i<=n) Update(root,1,n,2*j-i,n,a[i]+a[j]);//printf("%i %i %i %i: %i\n",i,j,2*j-i,n,a[i]+a[j]);}
        }
        while(j>=1 && Qs[j].fi.fi==i){
            res[Qs[j].se]=Get(root,1,n,Qs[j].fi.fi,Qs[j].fi.se);
            //printf("%i %i %i %i\n",res[Qs[j].se],Qs[j].fi.fi,Qs[j].fi.se,Qs[j].se);
            j--;
        }
        //if(i==3) printf("- %i -\n",Get(root,1,n,3,5));
    }
    for(int i=1;i<=Q;i++) printf("%i ",res[i]);
    return 0;
}

Compilation message

jumps.cpp: In function 'int main()':
jumps.cpp:63:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |     int n;scanf("%i",&n);
      |           ~~~~~^~~~~~~~~
jumps.cpp:64:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |     for(int i=1;i<=n;i++)scanf("%i",&a[i]);
      |                          ~~~~~^~~~~~~~~~~~
jumps.cpp:65:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |     int Q;scanf("%i",&Q);pair<pair<int,int>,int>Qs[Q+10];
      |           ~~~~~^~~~~~~~~
jumps.cpp:66:33: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |     for(int i=1;i<=Q;i++) {scanf("%i%i",&Qs[i].fi.fi,&Qs[i].fi.se);Qs[i].se=i;}
      |                            ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12648 KB Output is correct
2 Incorrect 2 ms 12636 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12648 KB Output is correct
2 Incorrect 2 ms 12636 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 158 ms 36172 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 12648 KB Output is correct
2 Incorrect 2 ms 12636 KB Output isn't correct
3 Halted 0 ms 0 KB -