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. jenkins html报告不显示样式

    解决办法: 1.安装Startup Trigger,在jenkins节点启动时触发构建: 2.安装Groovy,直接运行Groovy代码: 3.新建一个Job,用于jenkins启动时执行配置命令: ...

  2. 解决Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker fro问题

    项目中碰到一个问题,就是将一个map转换成json格式的时候出现错误,最后排查将延迟加载关闭后成功转换,因为数据量较大,于是重新创建了一个对象进行接收. 解决办法是在配置文件中进行配置 虽然解决了这个 ...

  3. 【转】VS2010不能引用System.Data.OracleClient解决方法

    源地址:http://blog.csdn.net/iloli/article/details/8484674

  4. 使用原生实现jquery中的css方法

    由于jquery放在mobile页面上,有时候还是显得有点大,所以今天尝试使用原生来开发,但是习惯了jquery之后,转用原生开发之后,发现原生中,找不到可以替代jquery的css方法,于是对原生的 ...

  5. 条目八《永不建立auto_ptr的容器》

    条目八<永不建立auto_ptr的容器> 重要的事说三次,永不建立auto_ptr的容器,永不建立auto_ptr的容器,永不建立auto_ptr的容器!!! 为什么? 实质是auto_p ...

  6. 传智播客Springmvc_mybatis学习笔记

    文件地址:https://download.csdn.net/download/qq_26078953/10614459

  7. Sql server inner join......on

    --查询的时候,如果表中有重名的列,此时,应该在通过 表名.列名 的方式来限定指定的列是哪张表中的.select PhoneNum.pid, PhoneNum.pname, PhoneNum.pcel ...

  8. 理解Javascript_02_执行上下文02

    上一篇我们讲到在全局环境下的代码段中,执行上下文环境中如何处理数据: 变量.函数表达式——变量声明,默认赋值为undefined: this——赋值: 函数声明——赋值: 这篇文章讲关于函数执行上下文 ...

  9. mac 配置charles

    从官网下载链接http://www.charlesproxy.com/download 附上注册码: Registered Name: https://zhile.io License Key: 48 ...

  10. tornado 02 输出、输入和URL传参

    tornado 02 输出.输入和URL传参 一.输出 write输出到页面 #write可以接受的对象 #write() 可以接受3种对象:bytes Unicode字符(二进制字符) 字典 #如果 ...