ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P4145 上帝造题的七分钟2 / 花神游历各国

2021-04-28 22:01:57  阅读:198  来源: 互联网

标签:400011 int mid long mark 七分钟 build P4145 造题


by luogu

可用于练习线段树

这里涉及到了开方操作

和 +   * 不同,它的运算次数大大减小

只有大概8次操作就会到1

而1无论开多少次的方

都是1

所以可以去掉懒标了

这里的mark所记录的是区间最大值

若最大值都为1,那么也就吗,没有必要再进行计算

但是修改的话

还是需要一次到底(l==r)

这次就懒得打注释了QAQ

#include<bits/stdc++.h>

#define int long long
#define mid ((l+r)>>1)
using namespace std;

int c[400011];
int a[400011],mark[400011];

void build(int x,int l,int r)
{
    if(l==r)
    {
        a[x]=c[l];
        mark[x]=c[l];
        return ;
    }
    
    build((x<<1),l,mid);
    build((x<<1)|1,mid+1,r);
    
    a[x]=a[x<<1]+a[(x<<1)|1];
    mark[x]=max(mark[x<<1],mark[(x<<1)|1]);
    
    return ;
}


void pl(int x,int l,int r,int s,int e)
{
    if(s>r||e<l)
    return ; 
    if(l==r)
    {
    a[x]=sqrt(a[x]);
        mark[x]=a[x];
        
        return ;
    }
//    push(x,l,r);
    if(mark[x<<1]>1&&mid>=s)
        pl((x<<1),l,mid,s,e);
        
    if(mark[(x<<1)|1]>1&&mid<e)
    pl((x<<1)|1,mid+1,r,s,e);
        
        
    a[x]=a[x<<1]+a[(x<<1)|1];
    mark[x]=max(mark[x<<1],mark[(x<<1)|1]);
    

    
    return ; 
}

int query(int x,int l,int r,int s,int e)
{
    if(s>r||e<l) 
    return 0; 
    if(s<=l&&r<=e) 
    return a[x];
    
    //push(x,l,r);
    return query((x<<1),l,mid,s,e)+query((x<<1)+1,mid+1,r,s,e);  
}

int n,m;

signed main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>c[i];
    
    build(1,1,n);    
    cin>>m;
    
    for(int i=1;i<=m;i++)
    {
        int q,w,e;
        cin>>q>>w>>e;
        if(w>e)
        swap(w,e);
        if(q)
        cout<<query(1,1,n,w,e)<<endl;

        else
            pl(1,1,n,w,e);
            
                
                
        
    }
    
    return 0;    
}

标签:400011,int,mid,long,mark,七分钟,build,P4145,造题
来源: https://www.cnblogs.com/Hehe-0/p/14715924.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有