zoukankan      html  css  js  c++  java
  • BZOJ3038: 上帝造题的七分钟2

    【传送门:BZOJ3038


    简要题意:

      给出一个序列,对这些序列进行两种操作:

      1 x y求出x到y的和

      2 x y将x到y的数全部开方(向下取整)


    题解:

      同BZOJ3211


    参考代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    struct node
    {
        int l,r,lc,rc;LL c;
        bool lazy;
    }tr[210000];int trlen;
    LL a[110000];
    void bt(int l,int r)
    {
        trlen++;int now=trlen;
        tr[now].l=l;tr[now].r=r;tr[now].c=0;
        tr[now].lc=tr[now].rc=-1;tr[now].lazy=false;
        if(l==r)
        {
            tr[now].c=a[l];
            if(tr[now].c==1||tr[now].c==0) tr[now].lazy=true;
        }
        else
        {
            int mid=(l+r)/2;
            tr[now].lc=trlen+1;bt(l,mid);
            tr[now].rc=trlen+1;bt(mid+1,r);
            tr[now].c=tr[tr[now].lc].c+tr[tr[now].rc].c;
            if(tr[tr[now].lc].lazy==true&&tr[tr[now].rc].lazy==true) tr[now].lazy=true;
        }
    }
    LL getsum(int now,int l,int r)
    {
        if(tr[now].l==l&&tr[now].r==r) return tr[now].c;
        int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
        if(r<=mid) return getsum(lc,l,r);
        else if(l>mid) return getsum(rc,l,r);
        else return getsum(lc,l,mid)+getsum(rc,mid+1,r);
    }
    void change(int now,int l,int r)
    {
        if(tr[now].lazy==true) return ;
        if(tr[now].l==tr[now].r)
        {
            tr[now].c=LL(sqrt(tr[now].c));
            if(tr[now].c==1||tr[now].c==0) tr[now].lazy=true;
            return ;
        }
        int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
        if(r<=mid) change(lc,l,r);
        else if(l>mid) change(rc,l,r);
        else
        {
            change(lc,l,mid);
            change(rc,mid+1,r);
        }
        tr[now].c=tr[lc].c+tr[rc].c;
        if(tr[lc].lazy==true&&tr[rc].lazy==true) tr[now].lazy=true;
    }
    int main()
    {
        int n,m;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        trlen=0;bt(1,n);
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            int t,x,y;
            scanf("%d%d%d",&t,&x,&y);
            if(x>y) swap(x,y);
            if(t==1) printf("%lld
    ",getsum(1,x,y));
            else change(1,x,y);
        }
        return 0;
    }
  • 相关阅读:
    android的左右滑动效果实现-ViewFlipper
    ios学习之UISwipeGestureRecognizer手势识别
    iOS使用AVFoundation实现二维码扫描
    IOS开发之Core Location
    iOS中如何创建一个滑出式导航面板(1)
    消息推送之百度云推送Android集成与使用方法
    IOS开发之Storyboard应用
    用CocoaPods做iOS程序的依赖管理
    RelativeLayout 布局参数
    Android中获取应用程序(包)的信息-----PackageManager的使用
  • 原文地址:https://www.cnblogs.com/Never-mind/p/8524874.html
Copyright © 2011-2022 走看看