萌新求助,50pts
查看原帖
萌新求助,50pts
241542
_OJF_楼主2021/7/17 22:12

我方法明明和题解区大佬差不多啊,为什么TLE了呢

#include<bits/stdc++.h>
using namespace std;
long long n, m, a[100005], op, x, y;
struct node{
    int l, r, id, sum;
    bool tag;
}f[400005];
inline void build(int l, int r, int id){
    f[id].l = l, f[id].r = r;
    if(l == r){
        f[id].sum = a[l];
        if(f[id].sum == 1 || f[id].sum == 0)
            f[id].tag = 1;
        return;
    }
    int mid = (r + l) / 2;
    build(l, mid, id * 2);
    build(mid + 1, r, id * 2 + 1);
    f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
    f[id].tag = f[id * 2].tag & f[id * 2 + 1].tag;
}
inline void sqr(long long l, long long r, int id){
    if(f[id].tag)
        return;
    if(f[id].l == f[id].r){
        f[id].sum = floor(sqrt(f[id].sum));
        if(f[id].sum == 1 || f[id].sum == 0)
            f[id].tag = 1;
        return;
    }
    if(r <= f[id * 2].r)
        sqr(l, r, id * 2);
    else
        if(l >= f[id * 2 + 1].l)
            sqr(l, r, id * 2 + 1);
        else
            sqr(l, f[id * 2].r, id * 2), sqr(f[id * 2 + 1].l, r, id * 2 + 1);
    f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
    f[id].tag = f[id * 2].tag & f[id * 2 + 1].tag;
}
inline int find(long long l, long long r, int id){
    if(f[id].l == l && f[id].r == r)
        return f[id].sum;
    if(r <= f[id * 2].r)
        return find(l, r, id * 2);
    else
        if(l >= f[id * 2 + 1].l)
            return find(l, r, id * 2 + 1);
        else
            return find(l, f[id * 2].r, id * 2) + find(f[id * 2 + 1].l, r, id * 2 + 1);
}
int main(){
    cin>>n;
    for(int i = 1;i <= n;i++)
        cin>>a[i];
    build(1, n, 1);
    cin>>m;
    for(int i = 1;i <= m;i++){
        scanf("%lld %lld %lld", &op, &x, &y);
        if(x > y)
            swap(x, y);
        if(op == 0)
            sqr(x, y, 1);
        if(op == 1)
            cout<<find(x, y, 1)<<endl;
    }
    return 0;
}
2021/7/17 22:12
加载中...