Submission #865645

# Submission time Handle Problem Language Result Execution time Memory
865645 2023-10-24T12:58:27 Z prohacker Triple Jump (JOI19_jumps) C++14
5 / 100
4000 ms 32336 KB
#include <bits/stdc++.h>
#define ll long long
#define ld long double

using namespace std;

const int N = 2e5+10;
const int INF = INT_MAX;
const int mod = 1e9+7;

int n,a[N];
int t;
vector<pair<int,int>> q[N];
stack<int> st;
ll ans[N],lazy[4*N];

struct Node{
    ll best,mx,Mx;

    Node() {};
    Node(ll _best, ll _mx, ll _Mx) {
        best = _best;
        mx = _mx;
        Mx = _Mx;
    };
}tree[4*N];

Node operator + (Node u, Node v) {
    Node res = u;
    res.best = max({res.best,u.mx+v.Mx,v.best});
    res.mx = max(res.mx,v.mx);
    res.Mx = max(res.Mx,v.Mx);
    return res;
}

void build(int id = 1, int l = 1, int r = n) {
    if(l == r) {
        tree[id].Mx = a[l];
        tree[id].best = a[l];
        return;
    }
    int mid = l + r >> 1;
    build(id << 1,l,mid);
    build(id << 1 | 1,mid+1,r);
    tree[id] = tree[id << 1] + tree[id << 1 | 1];
}

void down(int id, int l, int r) {
    ll t = lazy[id];
    if(t == 0) {
        return;
    }
    tree[id].mx = max(tree[id].mx,t);
    tree[id].best = tree[id].mx+tree[id].Mx;
    if(l < r) {
        lazy[id << 1] = max(lazy[id << 1],t);
        lazy[id << 1 | 1] = max(lazy[id << 1 | 1],t);
    }
    t = 0;
}

void update(int u, int v, ll val, int id = 1, int l = 1, int r = n) {
    down(id,l,r);
    if(u > v || l > r || r < u || v < l) {
        return;
    }
    if(l == r) {
        lazy[id] = val;
        down(id,l,r);
        return;
    }
    int mid = l + r >> 1;
    if(u <= mid) {
        update(u,v,val,id << 1,l,mid);
    }
    if(mid+1 <= v) {
        update(u,v,val,id << 1 | 1,mid+1,r);
    }
    tree[id] = tree[id << 1] + tree[id << 1 | 1];
}

Node get(int u, int v, int id = 1, int l = 1, int r = n) {
    if(u > v || l > r || r < u || v < l) {
        return {0,0,0};
    }
    if(u <= l && r <= v) {
        return tree[id];
    }
    int mid = l + r >> 1;
    return get(u,v,id << 1,l,mid)+get(u,v,id << 1 | 1,mid+1,r);
}

signed main()
{
    if (fopen("triplejump.inp", "r")) {
        freopen("triplejump.inp", "r", stdin);
        freopen("triplejump.out", "w", stdout);
    }
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 1 ; i <= n ; i++) {
        cin >> a[i];
    }
    cin >> t;
    for(int i = 1 ; i <= t ; i++) {
        int l,r; cin >> l >> r;
        q[l].push_back({r,i});
    }
    build();
    for(int i = n ; i > 0 ; i--) {
        while(!st.empty() && a[st.top()] < a[i]) {
            update(2*st.top()-i,n,a[i]+a[st.top()]);
            st.pop();
        }
        if(!st.empty()) {
            update(2*st.top()-i,n,a[i]+a[st.top()]);
        }
        st.push(i);
        for(auto p:q[i]) {
            ans[p.second] = get(i,p.first).best;
        }
    }
    for(int i = 1 ; i <= t ; i++) {
        cout << ans[i] << '\n';
    }
    return 0;
}

Compilation message

jumps.cpp: In function 'void build(int, int, int)':
jumps.cpp:42:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   42 |     int mid = l + r >> 1;
      |               ~~^~~
jumps.cpp: In function 'void update(int, int, long long int, int, int, int)':
jumps.cpp:72:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   72 |     int mid = l + r >> 1;
      |               ~~^~~
jumps.cpp: In function 'Node get(int, int, int, int, int)':
jumps.cpp:89:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   89 |     int mid = l + r >> 1;
      |               ~~^~~
jumps.cpp: In function 'int main()':
jumps.cpp:96:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |         freopen("triplejump.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:97:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         freopen("triplejump.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 2 ms 6748 KB Output is correct
3 Correct 1 ms 6748 KB Output is correct
4 Correct 1 ms 6748 KB Output is correct
5 Correct 1 ms 6748 KB Output is correct
6 Correct 2 ms 6748 KB Output is correct
7 Correct 2 ms 6748 KB Output is correct
8 Correct 1 ms 6748 KB Output is correct
9 Correct 2 ms 6748 KB Output is correct
10 Correct 2 ms 6748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 2 ms 6748 KB Output is correct
3 Correct 1 ms 6748 KB Output is correct
4 Correct 1 ms 6748 KB Output is correct
5 Correct 1 ms 6748 KB Output is correct
6 Correct 2 ms 6748 KB Output is correct
7 Correct 2 ms 6748 KB Output is correct
8 Correct 1 ms 6748 KB Output is correct
9 Correct 2 ms 6748 KB Output is correct
10 Correct 2 ms 6748 KB Output is correct
11 Runtime error 79 ms 32336 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 4022 ms 20668 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 6748 KB Output is correct
2 Correct 2 ms 6748 KB Output is correct
3 Correct 1 ms 6748 KB Output is correct
4 Correct 1 ms 6748 KB Output is correct
5 Correct 1 ms 6748 KB Output is correct
6 Correct 2 ms 6748 KB Output is correct
7 Correct 2 ms 6748 KB Output is correct
8 Correct 1 ms 6748 KB Output is correct
9 Correct 2 ms 6748 KB Output is correct
10 Correct 2 ms 6748 KB Output is correct
11 Runtime error 79 ms 32336 KB Execution killed with signal 11
12 Halted 0 ms 0 KB -