제출 #1369401

#제출 시각아이디문제언어결과실행 시간메모리
1369401solution6312Legendary Dango Eater (JOI26_dango)C++17
0 / 100
342 ms2312 KiB
#include <iostream>
#include <cassert>
using namespace std;
using ll=long long;

const int MN=5e5+13, ML=22;
int N, Q; ll K;
ll A[MN], alr[MN], pre[MN];
int nxt[MN][ML]; ll wgt[MN][ML];

int main()
{
    cin>>N>>Q>>K;
    for (int i=1; i<=N; i++)
    {
        cin>>A[i];
        if (i&1)
        {
            alr[i]=A[i]/K;
            A[i]%=K;
        }
        alr[i]+=alr[i-1];
        pre[i]=pre[i-1]+A[i];
    }
    pre[N+1]=pre[N];
    for (int x=1; x<=N; x+=2)
    {
        int y=x;
        while (y<=N && (pre[y]-pre[x-1])%K>=A[y+1]) y+=2;
        wgt[x][0]=(pre[y]-pre[x-1])/K;
        nxt[x][0]=y;
    }
    for (int j=1; j<ML; j++)
    {
        for (int i=1; i<=N; i++)
        {
            if (nxt[i][j-1]>N) nxt[i][j]=nxt[i][j-1];
            else
            {
                nxt[i][j]=nxt[nxt[i][j-1]][j-1];
                wgt[i][j]=wgt[i][j-1]+wgt[nxt[i][j-1]][j-1];
            }
        }
    }
    while (Q--)
    {
        int L, R; cin>>L>>R;
        if (!(L&1)) L++;
        if (!(R&1)) R--;
        if (L>R)
        {
            cout<<0<<endl;
            continue;
        }
        ll ans=alr[R]-alr[L-1];
        for (int i=ML-1; i>=0; i--)
        {
            if (nxt[L][i]<=R)
            {
                ans+=wgt[L][i];
                L=nxt[L][i]+2;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…