Can you answer these queries?

Time Limit:2000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64u

Description

A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the battleships. Each of the battleships can be marked a value of endurance. For every attack of our secret weapon, it could decrease the endurance of a consecutive part of battleships by make their endurance to the square root of it original value of endurance. During the series of attack of our secret weapon, the commander wants to evaluate the effect of the weapon, so he asks you for help. 
You are asked to answer the queries that the sum of the endurance of a consecutive part of the battleship line.

Notice that the square root operation should be rounded down to integer.

 

Input

The input contains several test cases, terminated by EOF. 
  For each test case, the first line contains a single integer N, denoting there are N battleships of evil in a line. (1 <= N <= 100000) 
  The second line contains N integers Ei, indicating the endurance value of each battleship from the beginning of the line to the end. You can assume that the sum of all endurance value is less than 2 63
  The next line contains an integer M, denoting the number of actions and queries. (1 <= M <= 100000) 
  For the following M lines, each line contains three integers T, X and Y. The T=0 denoting the action of the secret weapon, which will decrease the endurance value of the battleships between the X-th and Y-th battleship, inclusive. The T=1 denoting the query of the commander which ask for the sum of the endurance value of the battleship between X-th and Y-th, inclusive. 
 

Output

For each test case, print the case number at the first line. Then print one line for each query. And remember follow a blank line after each test case.
 

Sample Input

10
1 2 3 4 5 6 7 8 9 10
5
0 1 10
1 1 10
1 1 5
0 5 8
1 4 8
 

Sample Output

Case #1:
19
7
6
 
 
 
解题思路:刚开始看到题目的时候感觉蛮简单的,就是类似区间增减的感觉。但是慢慢写着写着感觉没法写了。于是就看了看网上别人的思路,发现原来平方藏有玄机。2^64如果要开方的话,最多也就开7次,所以记录每个结点所管辖叶子结点最少已经开了多少次方,就能省下很多的更新时间,如果能开方,就找到叶子结点进行开方操作,而询问就是简单的区间求和了。还有比较坑的就是X,Y大小关系没有说。
 
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
const int maxn = 120000;
const int INF = 0x3f3f3f3f;
typedef long long INT;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
struct SegTree{
INT val;
int coun;
}segs[maxn*4];
void PushUp(int rt){
segs[rt].val = segs[rt*2].val + segs[rt*2+1].val;
segs[rt].coun = min(segs[rt*2].coun,segs[rt*2+1].coun);
}
void buildtree(int rt,int L,int R){
segs[rt].coun = 0;
if(L == R){
scanf("%lld",&segs[rt].val);
return;
}
buildtree(lson);
buildtree(rson);
PushUp(rt);
}
void Update(int rt,int L,int R,int l_ran,int r_ran){
if(segs[rt].coun >= 8){
return ;
}
if(L == R){
segs[rt].val = (INT)sqrt(segs[rt].val);
segs[rt].coun++;
return;
}
if(l_ran <= mid)
Update(lson,l_ran,r_ran);
if(r_ran > mid)
Update(rson,l_ran,r_ran);
PushUp(rt);
}
INT query(int rt,int L,int R,int l_ran,int r_ran){
if(l_ran <= L && R <= r_ran){
return segs[rt].val;
}
INT ret = 0;
if(l_ran <= mid){
ret += query(lson,l_ran,r_ran);
}
if(r_ran > mid){
ret += query(rson,l_ran,r_ran);
}
return ret;
}
int main(){
int cas = 0, n , m;
while(scanf("%d",&n)!=EOF){
buildtree(1,1,n);
scanf("%d",&m);
printf("Case #%d:\n",++cas);
int c, u , v;
for(int i = 1; i <= m; i++){
scanf("%d%d%d",&c,&u,&v);
if(u > v){
swap(u,v);
}
if(c == 0){
Update(1,1,n,u,v);
}else{
INT res = query(1,1,n,u,v);
printf("%lld\n",res);
}
}puts("");
}
return 0;
}

  

 

HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】的更多相关文章

  1. hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和

    Can you answer these queries? Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...

  2. HDU 4027 Can you answer these queries? (线段树区间修改查询)

    描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...

  3. HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

    题目 线段树 简单题意: 区间(单点?)更新,区间求和  更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...

  4. hdu 4027 Can you answer these queries? 线段树

    线段树+剪枝优化!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #includ ...

  5. HDU 4027 Can you answer these queries? (线段树成段更新 && 开根操作 && 规律)

    题意 : 给你N个数以及M个操作,操作分两类,第一种输入 "0 l r" 表示将区间[l,r]里的每个数都开根号.第二种输入"1 l r",表示查询区间[l,r ...

  6. hdu 4027 Can you answer these queries?

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Description Proble ...

  7. HDU-4027-Can you answer these queries?线段树+区间根号+剪枝

    传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...

  8. HDU 4027 Can you answer these queries?(线段树区间开方)

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

  9. hdu 4027 Can you answer these queries? (区间线段树,区间数开方与求和,经典题目)

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

随机推荐

  1. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列   题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...

  2. 安装vm tools(方便虚拟机复制粘贴切换)

    在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(而不再用按ctrl+alT释放),而且还可以令 ...

  3. vim文本编辑

    6.1 vi/vim 的使用 基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),插入模式(Insert mode)和底线命令模式(Last line mode). 6. ...

  4. maven设置------settings.xml文件学习

    https://blog.csdn.net/tomato__/article/details/13025187 快速预览 maven的配置文件为settings.xml,在下面路径中可以找到这个文件, ...

  5. 深度剖析MQTT协议的整个通信流程

    http://www.elecfans.com/d/587483.html MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的o ...

  6. 最近关于linux的一些小问题。

    redhat 用yum更新时需要注册付费.centos 不用. 原来版本的ifconfig 在centos中变为了ip addr.

  7. 基于python-opencv3的图像显示和保存操作

    import cv2 as cv import numpy as np                        #导入库 print("------------------------ ...

  8. Spark Programming Guide《翻译》

    转载必须注明出处:梁杰帆 在这里要先感谢原作者们!如果各位在这里发现了错误之处,请大家提出 1.Initializing Spark     Spark程序必须做的第一件事就是创建一个SparkCon ...

  9. WCF 客户端连接慢

    WCF客户端第一次连接超过1分钟,以后再连接就快了. 在 Config中加入 <basicHttpBinding> <binding name="BasicHttpBind ...

  10. css实现正方形div的3种方式

    网上百度了几种可以按照百分比画方框的方法 1.CSS3 vw 单位 1vw = 1% viewport width <div class="vw">hello,view ...