답안 #443502

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
443502 2021-07-10T16:06:29 Z mjhmjh1104 사탕 분배 (IOI21_candies) C++17
0 / 100
134 ms 7244 KB
#include "candies.h"
#include <vector>
#include <algorithm>
using namespace std;

struct Move {
    long long o;
    long long n;
    long long c;
};

vector<Move> V;
long long cnt;

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
    cnt = 0; V.clear();
    int n = (int)c.size(), q = (int)v.size();
    long long globalMin = 0, globalMax = 0;
    vector<int> s(n);
    for (int t = 0; t < q; t++) {
        long long tmp_curr = v[t];
        if (tmp_curr > 0) {
            int curr = tmp_curr;
            while (!V.empty()) {
                if (V.back().n > V.back().o) {
                    tmp_curr = cnt + tmp_curr - V.back().o;
                    cnt = V.back().o;
                    V.pop_back();
                } else if (V.back().c <= curr) V.pop_back();
                else break;
            }
        } else {
            int curr = -tmp_curr;
            while (!V.empty()) {
                if (V.back().n < V.back().o) {
                    tmp_curr = cnt + tmp_curr - V.back().o;
                    cnt = V.back().o;
                    V.pop_back();
                } else if (V.back().c <= curr) V.pop_back();
                else break;
            }
        }
        V.push_back(Move{ cnt, cnt + tmp_curr, tmp_curr > 0 ? tmp_curr : -tmp_curr });
        cnt += tmp_curr;
        globalMin = min(globalMin, cnt), globalMax = max(globalMax, cnt);
    }
    //for (auto &i: V) printf("%lld %lld %d\n", i.o, i.n, i.c);
    for (int i = 0; i < n; i++) {
        long long l = globalMin, r = globalMax;
        if (V.front().c >= c[i]) {
            Move x = *(upper_bound(V.begin(), V.end(), Move{ 0LL, 0LL, c[i] }, [](const Move &a, const Move &b) {
                return a.c > b.c;
            }) - 1);
            if (x.o > x.n) l = x.n, r = l + c[i];
            else r = x.n, l = r - c[i];
        //printf("%lld %lld %d\n", x.o, x.n, x.c);
        }
        //printf("! %lld %lld\n", l, r);
        if (l < 0) s[i] = cnt - l;
        else if (r > c[i]) s[i] = cnt - r + c[i];
        else s[i] = cnt;
    }
    return s;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 0 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 134 ms 7244 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Incorrect 67 ms 5840 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 0 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -