1 条题解

  • 0
    @ 2024-10-17 17:31:38

    区间更新改为区间每个点都改一次,属于是负优化了,能过就行

    #include<bits/stdc++.h>
    #define ULL unsigned long long
    #define LL long long
    #define endl '\n'
    #define debug(a) cout<<#a<<"="<<a<<endl;
    #define all(v) v.begin(), v.end()
    #define PII pair<int,int>
    using namespace std;
    const int N =  1 *1e6 + 10,M = 5 * 1e3 + 10,inf = 0x3f3f3f3f;
    
    int n,m;
    int a[N];
    struct node
    {
        int l,r;
        LL sum,maxx;
    }tr[N*4];
    void pushup(int u) //从子节点更新父节点信息
    {
        tr[u].sum = tr[u<<1].sum + tr[u<<1|1].sum;
        tr[u].maxx = max(tr[u<<1].maxx,tr[u<<1|1].maxx);
    }
    void build(int u,int l,int r)
    {
        if(l==r) tr[u] = {l,r,a[r],a[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 modify(int u,int l,int r)
    {
        if(tr[u].l==tr[u].r) //每个点都改
        {
            tr[u].sum = sqrt(tr[u].sum);
            tr[u].maxx = sqrt(tr[u].maxx);
        }
        else
        {
            int mid = tr[u].l + tr[u].r >> 1;
            // 区间内最大值大于1就继续暴力开根号
            if(l <= mid && tr[u<<1].maxx > 1) modify(u<<1,l,r);
            if(r > mid && tr[u<<1|1].maxx > 1) modify(u<<1|1,l,r);
            pushup(u);
        }
    }
    LL 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;
        LL res = 0;
        if(l <= mid) res = query(u<<1,l,r);
        if(r > mid) res += query(u<<1|1,l,r);
        return res;
    }
    void solve()
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        build(1,1,n);
        cin>>m;
        while (m--)
        {
            int op,l,r;
            cin>>op>>l>>r;
            if(op==1) cout<<query(1,l,r)<<endl;
            else modify(1,l,r);
        }
        
    }
    int main()
    {
        ios::sync_with_stdio(0);cin.tie(nullptr),cout.tie(nullptr);
        int _=1;
        // cin>>_;
        while(_--)
        {
            solve();
        }
        return 0;
    }
    
    /**
     *    author: Nijika_jia
     *    created: 2024.10.17 16:31:13
     */
    
    • 1

    信息

    ID
    2710
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    5
    已通过
    2
    上传者