连样例都没过的线段树求调
查看原帖
连样例都没过的线段树求调
648623
hema5177楼主2024/2/25 14:47
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,m,a[100001],sum[400001],tag[400001],k,a1,p1;
void f(long long p,long long l,long long r,long long k)
{
    tag[p]+=k;
    sum[p]+=k*(r-l+1);
}
void push_up(long long p)
{
    sum[p]=max(sum[p*2],sum[p*2+1]);
}
void build(long long p,long long l,long long r)
{
    tag[p]=0;
    if(l==r)
    {
        sum[p]=a[l];
        return;
    }
    long long mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    push_up(p);
}
void push_down(long long p,long long l,long long r)
{
    if(tag[p])
    {
        long long mid=(l+r)/2;
        f(p*2,l,mid,tag[p]);
        f(p*2+1,mid+1,r,tag[p]);
        tag[p]=0;
    }
    
}
void update(long long nl,long long nr,long long l,long long r,long long p,long long k)
{
    if(nl<=l&&r<=nr)
    {
        sum[p]+=k*(r-l+1);
        tag[p]+=k;
        return;
    }
    push_down(p,l,r);
    long long mid=(l+r)/2;
    if(nl<=mid) update(nl,nr,l,mid,p*2,k);
    if(nr>mid) update(nl,nr,mid+1,r,p*2+1,k);
    push_up(p);
}
long long query(long long qx,long long qy,long long l,long long r,long long p)
{
    long long ans=0;
    if(qx<=l&&qy>=r) return sum[p];
    long long mid=(l+r)/2;
    push_down(p,l,r);
    if(qx<=mid) ans+=query(qx,qy,l,mid,p*2);
    if(qy>mid) ans+=query(qx,qy,mid+1,r,p*2+1);
    return ans;
}
int main()
{
    scanf("%lld%lld",&m,&p1);
    build(1,1,m);
    while(m--)
    {
        char b;
        cin>>b;
        if(b=='A')
        {
            k++;
            long long t;
            scanf("%lld",&t);
            update(k,k,1,k,1,(t+a1)%p1);
        }
        else if(b=='Q')
        {
            long long l;
            scanf("%lld",&l);
            a1=query(k-l+1,k,1,k,1);
            printf("%lld\n",a1);
        }
    }
}

直接抄的模版,只是把push_up里面的东西改了一下

我的奇怪的思路是先弄出来一个空树,然后在末尾添加一个数就是从末尾到末尾把空的位置加上那个数?

啊啊完全不行啊qaq

2024/2/25 14:47
加载中...