大佬求助
  • 板块灌水区
  • 楼主StrFaith
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/8/17 16:52
  • 上次更新2023/11/3 03:06:47
查看原帖
大佬求助
970752
StrFaith楼主2023/8/17 16:52

代码只有50分

P4515

#include <bits/stdc++.h>
using namespace std;
int n, q;
const int maxn = 1e5+1;
int nod[maxn];
unsigned long long sum[maxn<<2], mma[maxn<<2];
void up(int n) {
    sum[n] = sum[n<<1] +  sum[n<<1|1];
    mma[n] = max(mma[n<<1] , mma[n<<1|1]);
}
void build(int l, int r, int n) {
    if(l == r){
        sum[n] = nod[l];
        mma[n] = nod[l];
        return ;
    }
    int mid= (l +r) >>1;
    build (l, mid, n<<1);
    build(mid+1, r, n<<1|1);
    up(n);
}
void cha(int a, int b, int l, int r, int n){
    if(l == r&&a <= l&& r <= b) {
        sum[n] = mma[n] = sqrt(sum[n]);
        return;
    }
    int mid= ( l+ r) >>1;
    if(mid >= a&& mma[n<<1] >1) cha(a, b, l, mid, n<<1);
    if(mid < b&& mma[n<<1|1] >1) cha(a, b, mid+1, r, n<<1|1);
    up(n);
}
unsigned long long ask(int a, int b,int l, int r, int n){
    if(a <= l && r<= b) {
        return sum[n];
    }
    int mid = (l+r) >>1;         unsigned long long ans = 0;
    if(mid>= a) ans+= ask(a, b, l, mid, n<<1);
    if(mid < b) ans += ask(a, b, mid+1, r , n<<1|1);
    return ans;
}
int main() {
    //freopen ("ask.in", "r", stdin);
    memset(mma, 0, sizeof(mma));
    memset(sum, 0, sizeof(sum));
    scanf("%d",&n);
    for(int i = 1; i<= n;i++){
            scanf("%d", &nod[i]);
    }
    build(1, n,  1);
    scanf("%d", &q);
    while(q--){
        int a, b, m;
        scanf("%d%d%d", &m , &a, &b);
        if(a > b) swap(a, b);
        if(m == 0) {
                cha(a, b, 1, n, 1);
        } if(m == 1){
            printf("%lld\n", ask(a, b, 1, n, 1));
        }
    }
    return 0;
}

2023/8/17 16:52
加载中...