이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxN = 1'000'000;
const int logN = 21;
vector< vector<int> > R(1+maxN+1, vector<int>(1+logN));
vector<long long> val(1+maxN, 0);
int jump(int i, int s)
{
    for(int e = logN; e >= 0; e--)
    {
        if(s & (1 << e)) i = R[i][e];
    }
    return i;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int N, S;
    long long K;
    cin >> N >> S >> K;
    long long x[1+N];
    x[1] = 0;
    for(int i = 1; i <= N-1; i++)
    {
        long long d;
        cin >> d;
        x[i+1] = x[i] + d;
    }
    for(int i = 1; i <= N; i++)
    {
        cin >> val[i];
        val[i] += val[i-1];
    }
    int reach_left[1+N], reach_right[1+N];
    reach_left[1] = 1;
    for(int i = 2; i <= N; i++)
    {
        reach_left[i] = reach_left[i-1];
        while(x[i] - x[ reach_left[i] ] > K)
            reach_left[i]++;
    }
    reach_right[N] = N;
    for(int i = N-1; i >= 1; i--)
    {
        reach_right[i] = reach_right[i+1];
        while(x[ reach_right[i] ] - x[i] > K)
            reach_right[i]--;
    }
    R[N+1][0] = N+1;
    vector<int> midval(1+N);
    int mid = N;
    for(int i = N; i >= 1; i--)
    {
        while(i < reach_left[mid]) mid--;
        midval[i] = mid;
        R[i][0] = reach_right[mid] + 1;
    }
    // for(int i = 1; i <= N; i++) cerr << R[i][0] << ' ';
    // cerr << '\n';
    for(int e = 1; e <= logN; e++)
    {
        for(int i = 1; i <= N+1; i++)
        {
            R[i][e] = R[ R[i][e-1] ][e-1];
        }
    }
    int opt = -1;
    long long res = -1;;
    for(int i = 1; i <= N; i++)
    {
        int J = jump(i, S);
        if(val[J - 1] - val[i - 1] > res)
        {
            res = val[J - 1] - val[i - 1];
            opt = i;
        }
    }
    // cerr << "opt = " << opt << '\n';
    vector<int> ans;
    int remaining = S;
    while(remaining > 0 && opt != N+1)
    {
        // cerr << "opt = " << opt << '\n';
        ans.push_back(midval[opt]);
        opt = jump(opt, 1);
        remaining--;
    }
    cout << (int)ans.size() << '\n';
    for(int a:ans) cout << a << ' ';
    cout << '\n';
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |