TLE求助,过不去
查看原帖
TLE求助,过不去
241542
_OJF_楼主2021/7/18 23:04
#include<bits/stdc++.h>
using namespace std;
long long n, m, a[100005], op, x, y;
struct node{
    long long 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 long long 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(){
    int Case = 0;
    while(cin>>n){
		printf("Case #%d:\n", ++Case);
        for(int i = 1;i <= 4 * n;i++)
            f[i].sum = 0, f[i].tag = 0;
        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;
        }
        cout<<endl;
    }
    return 0;
}
2021/7/18 23:04
加载中...