• Tunnel Warfare(线段树 开方修改+剪枝优化


    题意:

    给定区间 ,有操作:

       0: 对指定区间内元素进行开方

       1: 查询指定区间内元素和

    一直tle...

    因为那个开方操作每次都递归到叶子节点进行了,实际并不需要

    增加数学敏感: 开方操作:同指数操作的快速增加一样,开方操作可以使一个数快速减小到1(取整条件下

    因此这道题节点的更新可以进行剪枝优化: 若该节点下的所有 叶子节点已经减小到一(这是很快的),则直接return

    此外,注意此题的对区间操作的l ,r 并没有说明r>l,因此输入后要判断一下

    #include <bits/stdc++.h>
    using namespace std ;
    
    #define ll long long
    
    ll t[800050];
    ll ans;
    void push_up( int pos){
         t[pos] = t[pos<<1] + t[pos<<1|1];
    }
    void build( int L ,int R ,int pos){
         if( L==R ){scanf("%lld",&t[pos]); return;}
         int mid=(L +R)>>1;
         build(L ,mid ,pos<<1);
         build(mid+1 ,R ,pos<<1|1);
         push_up(pos);
         return ;
    }
    
    void updata( int l ,int r ,int L ,int R ,int pos){
         if( t[pos]==R -L +1)return;  //剪枝,该区间内所有元素已速减到1
         if( L>=l && R<=r && L==R){
             t[pos]=(ll) sqrt(t[pos]);
             return;
         }
         if(L==R)return;
         int mid=(L+R)>>1;
         if( mid >= l) updata(l ,r, L ,mid ,pos<<1);
         if( mid < r) updata(l ,r ,mid+1, R ,pos<<1|1);
         push_up(pos);
         return ;
    }
    
    void query( int l ,int r ,int L ,int R ,int pos ){
         if( L >=l && R <=r){
             ans+=t[pos];
             return ;
         }
         if( L==R )return ;
         int mid=(L+R)>>1;
         if( mid >= l) query(l ,r, L ,mid ,pos<<1);
         if( mid < r)  query(l ,r ,mid+1, R ,pos<<1|1);
         return;
    }
    
    int main( ){
         int m,n,ks=1;
         while(scanf("%d",&n)!=EOF){
         build( 1 , n ,1);
         scanf("%d" ,&m);
         printf("Case #%d:
    ",ks++);
         while( m--){
               int t,l,r;
               scanf("%d%d%d",&t,&l,&r);
               if( l >r)swap(l,r);          //判断调整l,r大小
               if( t==0) updata( l ,r,1 ,n ,1);
               if( t==1){
                   ans=0;
                   query( l, r ,1 ,n ,1);
                   printf("%lld
    ",ans);
               }
            }
            printf("
    ");
         }
         return 0;
    }
  • 相关阅读:
    IOS-多线程知识
    《shop》 --- 自定义工具类 分页功能
    navicat for mysql 显示中文乱码解决办法
    Linux -- 搭建php服务器环境小记
    在自己主机搭建svn服务器,在远程地址里搭建svn服务器
    $ThinkPhp学习,shop项目 小记
    php 个人博客 实战小记
    php:require 和 include 的区别 5.9日
    mysql的入门命令 ==留言本的思路==
    Access denied for user 'root'@'localhost' (using password: YES) 问题解决小记
  • 原文地址:https://www.cnblogs.com/-ifrush/p/10616739.html
Copyright © 2020-2023  润新知