제출 #1357894

#제출 시각아이디문제언어결과실행 시간메모리
1357894BigBadBullyLegendary Dango Eater (JOI26_dango)C++20
5 / 100
823 ms239248 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
#define tri array<int, 3>
const int inf = 2e18;
const int mod = 1e9+7;
const int mxn = 2e6 + 1;
vector<int> fact(mxn+1,1),invfact(mxn+1,1);


int exp(int x, int n)
{
    int res = 1;
    for (; n > 0; res = (n % 2 ? res * x % mod : res), x = x * x % mod, n /= 2)
        ;
    return res;
}

int inv(int x)
{
    return exp(x, mod - 2);
}



void init()
{
    for(int i = 1; i <= mxn; i++)
        fact[i]=fact[i-1]*i%mod;
    invfact[mxn] = inv(fact[mxn]);
    for(int i = mxn-1; i >= 0; i--)
        invfact[i]=invfact[i+1]*(i+1)%mod;
    
}

int ncr(int n,int r)
{
    if(n<r ||n<0||r<0)
        return 0;
    return fact[n]*invfact[r]%mod*invfact[n-r]%mod;
}

struct node{
    int pref=0,suf=0,mx=0,sum=0;
    node operator+(node b)
    {
        node res(0);
        res.pref=max(pref,sum+b.pref);
        res.suf = max(b.sum+suf,b.suf);
        res.mx = max({mx,b.mx,suf+b.pref});
        res.sum =sum+b.sum;
        return res;
    }

    node(int a)
    {
        pref =suf=mx=sum=a;
    }
};

struct seggy{
    int n;
    vector<node> t;
    seggy(int sz)
    {
        n = sz;
        t.resize(2*n,node(0));
    }
    void update(int i,int x)
    {
        for(t[i+=n]=node(x);i/=2;)
            t[i]=t[i<<1]+t[i<<1|1];
    }
    node query(int l,int r)
    {
        r++;
        node lef(0),rig(0);
        for(l+=n,r+=n;l<r;l/=2,r/=2)
        {
            if(l&1)lef = lef+t[l++];
            if(r&1)rig = t[--r]+rig;
        }
        return lef+rig;
    }
};


void solve()
{
    int n,q,k;
    cin >> n >> q >> k;
    vector<int> v(n);
    for(int&x:v)cin>>x;
    v.push_back(0);v.push_back(0);
    vector<pii> nxt(n+2,{n,0});
    
    for(int i = 0;i < n; i+=2)
        nxt[i]={i+1,v[i]/k};
    seggy mile(n);
    for(int i = 0; i < n; i++)
        v[i]*=(i%2?-1:1),mile.update(i,v[i]);
    int j = n;
    if(j%2)j--;
    for(int i =n-1; i >= 0; i--)
    {
        if(i%2==0&&i!=0)i--;
        if(i<0)break;
        while(j>i+1&&mile.query(i,j-2).mx>=k)
            j-=2;
        if(j==i+1)
            nxt[i] = {j,0};
        else
        {
            int ad = mile.query(i,j-1).suf;
            nxt[i]={j+1,(ad+v[j])/k};
        }
    }
    vector<vector<pii>> lift(20,vector<pii>(n+2,{n,0}));
    lift[0] = nxt;
    for(int b = 1;b < 20;b++)
        for(int i = 0; i < n; i++)
        {
            lift[b][i].ss = lift[b-1][i].ss+lift[b-1][lift[b-1][i].ff].ss;
            lift[b][i].ff = lift[b-1][lift[b-1][i].ff].ff;
        }
    while(q--)
    {
        int l,r;
        cin >> l>>r;
        --l,--r;
        int tot = 0;
        for(int b = 19;b>=0;b--)
            if(lift[b][l].ff<=r+1)
            {
                tot+=lift[b][l].ss;
                l=lift[b][l].ff;
            }
        cout<<tot<<'\n';
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    init();

    int t=1;
    //cin >>t;
    while(t--)solve();
        
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...