답안 #949780

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
949780 2024-03-19T17:22:44 Z dwuy 3단 점프 (JOI19_jumps) C++14
0 / 100
59 ms 35412 KB
#include <bits/stdc++.h>

#define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL)
#define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout)
#define fi first
#define se second
#define endl "\n"
#define len(s) int32_t(s.length())
#define MASK(k)(1LL<<(k))
#define TASK "test"

using namespace std;

typedef tuple<int, int, int> tpiii;
typedef pair<double, double> pdd;
typedef pair<int, int> pii;
typedef long long ll;

const long long OO = 1e18;
const int MOD = 1e9 + 7;
const int INF = 1e9;
const int MX = 500005;

int n;
int a[MX];
pii mx[MX][19];


void nhap(){
    cin >> n;   
    for(int i=1; i<=n; i++) cin >> a[i];
}

pii get(int l, int r){
    int k = __lg(r-l+1);
    return max(mx[l][k], mx[r-MASK(k)+1][k]);
}

void solve(){
    for(int i=1; i<=n; i++) mx[i][0] = {a[i], i};
    for(int j=1; j<=18; j++){
        for(int i=1; i+MASK(j)-1<=n; i++){
            mx[i][j] = max(mx[i][j-1], mx[i+MASK(j-1)][j-1]);
        }
    }

    int q;
    cin >> q;
    while(q--){
        int l, r;
        cin >> l >> r;

        vector<int> pos;
        priority_queue<pair<pii, pii>> Q;
        Q.push({get(l, r), {l, r}});
        while(Q.size() && pos.size()<9){
            pii f1, f2;
            tie(f1, f2) = Q.top();
            Q.pop();
            pos.push_back(f1.se);
            if(f2.fi != f1.se) Q.push({get(f2.fi, f1.se - 1), {f2.fi, f1.se - 1}});
            if(f2.se != f1.se) Q.push({get(f1.se + 1, f2.se), {f1.se + 1, f2.se}});
        }
        int ans = 0;
        sort(pos.begin(), pos.end());
        for(int t1=0; t1<(int)pos.size(); t1++){
            int i = pos[t1];
            for(int t2=t1+1; t2<(int)pos.size(); t2++){
                int j = pos[t2];
                if(i != l){
                    ans = max(ans, get(max(l, 2*i - j), i-1).fi + a[i] + a[j]);
                }
                if(i+1!=j){
                    ans = max(ans, get(i+1, (i+j)>>1).fi + a[i] + a[j]);
                }
                if(r-j >= j-i){
                    ans = max(ans, get(2*j - i, r).fi + a[i] + a[j]);
                }
            }
        }
        cout << ans << endl;
    }
}

int32_t main(){
    fastIO;
    //file(TASK);

    nhap();
    solve();

    return 0;
}




# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2396 KB Output is correct
2 Correct 1 ms 2396 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 1 ms 2396 KB Output is correct
6 Correct 1 ms 2396 KB Output is correct
7 Incorrect 1 ms 2396 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2396 KB Output is correct
2 Correct 1 ms 2396 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 1 ms 2396 KB Output is correct
6 Correct 1 ms 2396 KB Output is correct
7 Incorrect 1 ms 2396 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 59 ms 35136 KB Output is correct
2 Correct 50 ms 35412 KB Output is correct
3 Correct 42 ms 35164 KB Output is correct
4 Incorrect 45 ms 35164 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2396 KB Output is correct
2 Correct 1 ms 2396 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 1 ms 2396 KB Output is correct
6 Correct 1 ms 2396 KB Output is correct
7 Incorrect 1 ms 2396 KB Output isn't correct
8 Halted 0 ms 0 KB -