萌新刚学线段树 0ms TLE 求助!
查看原帖
萌新刚学线段树 0ms TLE 求助!
184500
hanzhongtlx楼主2020/10/26 15:19

球珠!

#include"iostream"
#include"cstdio"
#include"cstring"
#include"cmath"
using namespace std;

#define read(x) scanf("%d",&x)
#define ll long long
#define MAXN 100005

struct node
{
    ll l,r,sum,rec;
}a[MAXN<<2];
int n,m;
ll t[MAXN];
int cnt=0,l,r,v;

void update(int k){a[k].sum=a[k<<1].sum+a[k<<1|1].sum,a[k].rec=max(a[k<<1].rec,a[k<<1|1].rec);}

void build(int k,int l,int r)
{
    a[k].l=l,a[k].r=r;
    if(l==r){a[k].sum=a[k].rec=t[l];return;}
    int mid=(l+r)>>1;
    build(k<<1,l,mid),build(k<<1|1,mid+1,r);
    update(k);
    return;
}

void turn(int k,int l,int r)
{
    if(a[k].l==a[k].r){a[k].sum=a[k].rec=sqrt(a[k].sum);return;}
    int mid=(a[k].l+a[k].r)>>1;
    if(a[k<<1].rec)
        if(r<=mid) turn(k<<1,l,r);
        else if(l<=mid) turn(k<<1,l,mid);
    if(a[k<<1|1].rec)
        if(l>mid) turn(k<<1|1,l,r);
        else if(r>mid) turn(k<<1|1,mid+1,r);
    update(k);
}

ll query(int k,int l,int r)
{
    if(a[k].l==l&&a[k].r==r) return a[k].sum;
    int mid=(a[k].l+a[k].r)>>1;
    if(r<=mid) return query(k<<1,l,r);
    else if(l>mid) return query(k<<1|1,l,r);
    else return query(k<<1,l,mid)+query(k<<1|1,mid+1,r);
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++) scanf("%lld",&t[i]);
        build(1,1,n);
        read(m);
        printf("Case #%d:",++cnt);
        for(int i=1;i<=m;i++)
        {
            read(v),read(l),read(r);
            if(l>r) swap(l,r);
            if(!v) turn(1,l,r);else printf("%lld\n",query(1,l,r));
        }
        puts("");
    }
    return 0;
}
2020/10/26 15:19
加载中...