답안 #131777

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
131777 2019-07-17T15:34:26 Z PeppaPig 휴가 (IOI14_holiday) C++14
100 / 100
603 ms 53744 KB
#include "holiday.h"
#include <bits/stdc++.h>

#define long long long

using namespace std;

const int N = 1e5+5;

int ptr;
long t1[N * 20], t2[N * 20];
int L[N * 20], R[N * 20];

int newleaf(long sum, long cnt) {
    t1[ptr] = sum, t2[ptr] = cnt;
    L[ptr] = -1, R[ptr] = -1;
    return ptr++;
}

int newpar(int l, int r) {
    t1[ptr] = t1[l] + t1[r], t2[ptr] = t2[l] + t2[r];
    L[ptr] = l, R[ptr] = r;
    return ptr++;
}

int n, d, start, a[N], ver[N];
long ans = -1;
vector<int> coord;
map<int, int> M;

int build(int l = 1, int r = n) {
    if(l == r) return newleaf(0, 0);
    int mid = (l + r) >> 1;
    return newpar(build(l, mid), build(mid+1, r));
}

int update(int x, long k, int p, int l = 1, int r = n) {
    if(l == r) return newleaf(k, 1);
    int mid = (l + r) >> 1;
    if(x <= mid) return newpar(update(x, k, L[p], l, mid), R[p]);
    else return newpar(L[p], update(x, k, R[p], mid+1, r));
}

long query(int k, int pl, int pr, int l = 1, int r = n) {
    if(!k) return 0;
    if(l == r) return t1[pr] - t1[pl];
    long sum_r = t1[R[pr]] - t1[R[pl]], cnt_r = t2[R[pr]] - t2[R[pl]];
    int mid = (l + r) >> 1;
    if(cnt_r >= k) return query(k, R[pl], R[pr], mid+1, r);
    else return sum_r + query(k - cnt_r, L[pl], L[pr], l, mid);
}

void solve(int l, int r, int optl, int optr) {
    if(l > r) return;
    long now = -1, idx = optl;
    int mid = (l + r) >> 1;
    for(int i = max(mid, optl); i <= min(mid + d - 1, optr); i++) {
        int cost = i - mid + min(abs(start - i), abs(start - mid));
        if(d - cost - 2 < 0) continue;
        long q = query(d - cost - 2, ver[mid], ver[i-1]) + a[mid] + a[i];
        if(q > now) now = q, idx = i;
    }
    ans = max(ans, now);
    solve(l, mid-1, optl, idx), solve(mid+1, r, idx, optr);
}

long findMaxAttraction(int _n, int _start, int _d, int _a[]) {
    n = _n, start = _start + 1, d = _d;
    for(int i = 1; i <= n; i++) {
        a[i] = _a[i-1];
        coord.emplace_back(a[i]);
    }
    if(d == 1) return a[start];
    sort(coord.begin(), coord.end());
    ver[0] = build();
    for(int i = 1; i <= n; i++) {
        int idx = lower_bound(coord.begin(), coord.end(), a[i]) - coord.begin() + ++M[a[i]];
        ver[i] = update(idx, a[i], ver[i-1]);
    }
    solve(max(1, start - d + 1), min(n, start + d - 1), 1, n);

    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 288 ms 48288 KB Output is correct
2 Correct 164 ms 48240 KB Output is correct
3 Correct 281 ms 48216 KB Output is correct
4 Correct 159 ms 48240 KB Output is correct
5 Correct 351 ms 44016 KB Output is correct
6 Correct 74 ms 12664 KB Output is correct
7 Correct 177 ms 23668 KB Output is correct
8 Correct 222 ms 28912 KB Output is correct
9 Correct 37 ms 8956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 1528 KB Output is correct
2 Correct 5 ms 1400 KB Output is correct
3 Correct 6 ms 1528 KB Output is correct
4 Correct 7 ms 1528 KB Output is correct
5 Correct 7 ms 1400 KB Output is correct
6 Correct 4 ms 760 KB Output is correct
7 Correct 3 ms 632 KB Output is correct
8 Correct 3 ms 632 KB Output is correct
9 Correct 3 ms 632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 288 ms 48300 KB Output is correct
2 Correct 320 ms 53744 KB Output is correct
3 Correct 138 ms 23156 KB Output is correct
4 Correct 7 ms 1528 KB Output is correct
5 Correct 3 ms 760 KB Output is correct
6 Correct 4 ms 760 KB Output is correct
7 Correct 3 ms 632 KB Output is correct
8 Correct 603 ms 53132 KB Output is correct
9 Correct 572 ms 53232 KB Output is correct