社区讨论

RE求调

SP2713GSS4 - Can you answer these queries IV参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lop7hra1
此快照首次捕获于
2023/11/08 11:34
2 年前
此快照最后确认于
2023/11/08 15:22
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 100010;

int n,m;
int w[N];

struct SegTree
{
    int l,r;//[l,r]
    long long sum,maxn;
}tr[N << 2];
//快读
inline void read(int& x)
{
    x=0;int f = 1;char c = getchar();
    while(!isdigit(c)){if(c == '-')f = -1;c = getchar();}
    while(isdigit(c)){x = (x<<1)+(x<<3)+(c^48);c = getchar();}
    x*=f;
}
//向上更新回根
void pushup(int u)
{
    tr[u].sum = tr[u<<1].sum+tr[u<<1|1].sum;
    tr[u].maxn = max(tr[u<<1].maxn,tr[u<<1|1].maxn);
}
//递归建树tr[u]存储[l,r]
void build(int u,int l,int r)
{
    if(l == r) tr[u] = {l,r,w[r],w[r]};
    else
    {
        tr[u] = {l,r};
        int mid = (l+r)>>1;
        //左子树
        build(u<<1,l,mid);
        //右子树
        build(u<<1|1,mid+1,r);
        //递归建树区间和要上传到根
        pushup(u);
    }
}

// void change(int u,int l,int r)
// {
//     if(l == r)
//     {
//         tr[l].sum = sqrt(tr[l].sum);
//         return ;
//     }
//     else
//     {
//         int mid = (l+r)>>1;
//         change(u,l,mid);
//         change(u,mid+1,r);
//         pushup(u);
//     }
    
// }
//区间修改
void modify(int u,int l,int r)
{
    //在当前区间内部
    if(tr[u].l == tr[u].r)
    {
        tr[u].sum = floor(sqrt(tr[u].sum));
        tr[u].maxn = floor(sqrt(tr[u].maxn));
    }
    else
    {
        int mid = (tr[u].l+tr[u].r)>>1;
        //当前区间在左半区间
        if(l<=mid && tr[u<<1].maxn>1) modify(u<<1,l,r);
        //当前区间在右半区间
        if(r>mid && tr[u<<1|1].maxn>1) modify(u<<1|1,l,r);
        //向上更新
        pushup(u);
    }
}

//区间查询
long long query(int u,int l,int r)
{
    //就是当前区间
    if(tr[u].l>=l && tr[u].r<=r) return tr[u].sum;
    int mid = (tr[u].l+tr[u].r) >> 1;
    long long sum = 0;
    //当前区间在左半区间
    if(l<=mid) sum += query(u<<1,l,r);
    //当前区间在右半区间
    if(r>mid) sum+=query(u<<1|1,l,r);
    return sum;
}

signed main()
{
    int _case = 0;
    while(~scanf("%lld",&n))
    {
        printf("Case #%lld\n",++_case);
        memset(w,0,sizeof(w));
        memset(tr,0,sizeof(tr));
        read(n);
        for(int i=1;i<=n;i++) read(w[i]);
        read(m);
        build(1,1,n);
        int op,l,r;
        while(m--)
        {
            read(op);read(l);read(r);
            if(l>r) swap(l,r);
            if(op == 0) modify(1,l,r);
            else if(op == 1) printf("%lld\n",query(1,l,r));
        }
    }
}

回复

1 条回复,欢迎继续交流。

正在加载回复...