답안 #583122

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
583122 2022-06-24T21:04:52 Z SlavicG 사탕 분배 (IOI21_candies) C++17
0 / 100
1073 ms 51644 KB
#include "bits/stdc++.h"
#include "candies.h"
using namespace std;

using ll = long long;
const ll inf = 1e16;
const int N = 2e5 + 10;
struct node {
    ll mn, mx, posmn, posmx;
};
node neutral = {inf, -inf, -1, -1};

node t[4 * N];
ll lazy[4 * N];

void push(int i, int l, int r) {
    if(!lazy[i]) return;
    t[i].mn += lazy[i];
    t[i].mx += lazy[i];
    if(l != r) {
        lazy[2 * i] += lazy[i];
        lazy[2 * i + 1] += lazy[i];
    }
    lazy[i] = 0;
}

node merge(node a, node b) {
    if(a.mn == -1) return b;
    if(b.mn == -1) return a;
    node c;
    c.mn = min(a.mn, b.mn);
    c.mx = max(a.mx, b.mx);
    c.posmn = (a.mn < b.mn ? a.posmn : b.posmn);
    c.posmx = (a.mx > b.mx ? a.posmx : b.posmx);
    return c;
}

void modif(int i, int l, int r, int tl, int tr, ll val) {
    push(i, l, r);
    if(l > tr || r < tl) return;
    if(l >= tl && r <= tr) {
        lazy[i] += val;
        push(i, l, r);
        return;
    }
    int mid = l + r >> 1;
    modif(2 * i, l, mid, tl, tr, val);
    modif(2 * i + 1, mid + 1, r, tl, tr, val);
    t[i] = merge(t[2 * i], t[2 * i + 1]);
}
node query(int i, int l, int r, int tl, int tr) {
    push(i, l, r);
    if(l > tr || r < tl) return neutral;
    if(l >= tl && r <= tr) return t[i];
    int mid = l + r >> 1;
    return merge(query(2 * i, l, mid, tl, tr), query(2 * i + 1, mid + 1, r, tl, tr));
}
void build(int i, int l, int r) {
    if(l > r) return;
    if(l == r) {
        t[i].mx = t[i].mn = 0;
        t[i].posmn = t[i].posmx = l;
        lazy[i] = 0;
        return;
    }
    int mid = l + r >> 1;
    build(2 * i, l, mid);
    build(2 * i + 1, mid + 1, r);
    t[i] = merge(t[2 * i], t[2 * i + 1]);
}
std::vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
    int n = c.size(), q = l.size();
    build(1, 0, q);

    vector<ll> a(n, 0);
    for(int i = 0; i < q; ++i) {
        modif(1, 0, q, i + 1, q, v[i]);
    }
    for(int i = 0; i < n; ++i) {
        int l = 0, r = q - 1, pos = -1;
        while(l <= r) {
            int mid = l + r >> 1;
            node x = query(1, 0, q, mid, q);
            if(x.mx - x.mn >= c[i]) {
                pos = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        if(pos != -1) {
            node x = query(1, 0, q, pos, q);
            if(x.posmx <= x.posmn) {
                a[i] = 0;
            } else {
                a[i] = c[i];
            }
            int j = max(x.posmn, x.posmx);
            if(j + 1 <= q) {
                a[i] += query(1, 0, q, q, q).mx - query(1, 0, q, j, j).mx;
            }
            assert(a[i] >= 0 && a[i] <= c[i]);
        } else {
            a[i] = query(1, 0, q, q, q).mx;
            assert(a[i] >= 0 && a[i] <= c[i]);
        }
    }
    vector<int> cc(n);
    for(int i = 0; i < n; ++i) cc[i] = a[i];
    return cc;
}
/*
3
10 15 13
2
0 2 20
0 1 -11
*/

Compilation message

candies.cpp: In function 'void modif(int, int, int, int, int, ll)':
candies.cpp:46:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |     int mid = l + r >> 1;
      |               ~~^~~
candies.cpp: In function 'node query(int, int, int, int, int)':
candies.cpp:55:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |     int mid = l + r >> 1;
      |               ~~^~~
candies.cpp: In function 'void build(int, int, int)':
candies.cpp:66:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   66 |     int mid = l + r >> 1;
      |               ~~^~~
candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:82:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   82 |             int mid = l + r >> 1;
      |                       ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 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 1073 ms 29444 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Runtime error 132 ms 51644 KB Execution killed with signal 6
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -