답안 #722742

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
722742 2023-04-12T18:48:29 Z Mr_Husanboy 사탕 분배 (IOI21_candies) C++17
0 / 100
1273 ms 43532 KB
#include "candies.h"
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
template<typename T>
int len(T &a){
    return a.size();
}

const ll infl = 1e8;

struct Segtree{
    struct node{
        ll mx = 0, mn = 0, add = 0;
        void apply(ll x){
            mn += x; mx += x;
            add += x;
        }
    };

    vector<node> t;
    int n;

    Segtree(int _n){
        n = _n;
        t.resize(4 * n);
    }

    void push(int x){
        if(t[x].add){
            t[x << 1].apply(t[x].add);
            t[x << 1 | 1].apply(t[x].add);
            t[x].add = 0;
        }
    }

    node merge(node a, node b){
        return {max(a.mx, b.mx), min(a.mn, b.mn), 0ll};
    }

    void upd(int x, int lx, int rx, int l, int r, ll val){
        if(l <= lx && rx <= r){
            t[x].apply(val);
            return;
        }
        if(r < lx || l > rx){
            return;
        }
        int m = (rx + lx) >> 1;
        push(x);
        upd(x << 1, lx, m, l, r, val);
        upd(x << 1 | 1, m + 1, rx, l, r, val);
        t[x] = merge(t[x << 1], t[x << 1 | 1]);
    }

    node get(int x, int lx, int rx, int l, int r){
        if(l <= lx && rx <= r){
            return t[x];
        }
        if(r < lx || l > rx){
            return {0,0,0};
        }
        push(x);
        int m = (lx + rx) >> 1;
        return merge(get(x << 1, lx, m, l, r),
            get(x << 1 | 1, m + 1, rx, l, r));
    }

    void upd(int l, int r, ll val){
        upd(1, 0, n - 1, l, r, val);
    }

    node get(int l, int r){
        return get(1, 0, n - 1, l, r);
    }
};




vector<int> distribute_candies(vector<int> c, vector<int> l,
                                    vector<int> r, vector<int> v) {
    int n = c.size();
    int m = len(v);
    Segtree t(m + 1);
    vector<vector<int>> in(n), out(n);
    for(int i = 0; i < m; i ++){
        in[l[i]].push_back(i);
        out[r[i]].push_back(i);
    }

    for(int i = 0; i < n; i ++){
        for(auto u : in[i]){
            t.upd(0, u, -v[u]);
        }
        int l = 0, r = m;
        while(l <= r){
            int mid = (l + r) >> 1;
            auto res = t.get(mid, m);
            if(res.mx - res.mn >= c[i]){
                l = mid + 1;
            }else r = mid - 1;
        }
        r ++;
        if(r == 0 || v[r - 1] < 0){
            c[i] = -t.get(r, m).mn;
        }else{
            c[i] = c[i] - t.get(r, m).mx;
        }

        for(auto u : out[i]){
            t.upd(0, u, v[i]);
        }

    }
    //for(auto u : suf) cout << u << ' ';cout << endl;
    return c;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1273 ms 43532 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 304 KB Output is correct
3 Correct 174 ms 27284 KB Output is correct
4 Runtime error 325 ms 24360 KB Execution killed with signal 11
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -