hdu 4027 Can you answer these queries?[线段树]
题意:
输入一个 :n 。(1<=n<<100000)
输入n个数 (num<2^63)
输入一个m :代表m个操作 (1<=m<<100000;)
接下来m行,每行三个数a,b,c,如果a==0,执行操作1;如果a==1,执行操作2.
操作1:对[b,c]区间上的每一个数进行开平方操作
操作2:对[b,c]区间求和,输出。
一直超时,这道题的关键在于: 2^63−1也就最多开8次平方根,,,而且开到1时再开平方根还是1.
所以再开到区间所有数都为1时就不再对这个区间更新,也就是当sum[rt]==r-l+1 时就返回上一层,这样就减小了更新时的操作
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
LL sum[maxn*4];
int n,m;
int Max(int a,int b)
{
if(a>b) return a;
else return b;
}
int Min(int a,int b)
{
if(a<b) return a;
else return b;
}
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
return ;
}
void build(int l,int r,int rt)
{
sum[rt]=0;
if(l==r) {
scanf("%lld",&sum[rt]);
return ;
}
int mid = (l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int x,int y,int l,int r,int rt)
{
if(l==r){
sum[rt]=sqrt(1.0*sum[rt]);
return;
}
if(x<=l&&r<=y&&sum[rt]==r-l+1){
return;
}
int mid = (l+r)>>1;
if(x<=mid) update(x,y,lson);
if(mid < y) update(x,y,rson);
pushup(rt);
}
LL query(int x,int y,int l,int r,int rt)
{
if(x<=l&&r<=y) return sum[rt];
int mid = (l+r)>>1;
LL ans = 0;
if(x<=mid) ans+=query(x,y,lson);
if(mid<y) ans+=query(x,y,rson);
return ans;
}
int main()
{
int Case = 1;
int a,b,c,x,y;
while(~scanf("%d",&n))
{
printf("Case #%d:\n",Case++);
build(1,n,1);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
x=Min(b,c),y=Max(b,c);
if(a==0){//update
update(x,y,1,n,1);
}else{//query
LL res = query(x,y,1,n,1);
printf("%lld\n",res);
}
}
printf("\n");
}
return 0;
}
hdu 4027 Can you answer these queries?[线段树]的更多相关文章
- 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 ...
- 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 ...
- HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)
题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...
- hdu 4027 Can you answer these queries? 线段树
线段树+剪枝优化!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #includ ...
- HDU 4027 Can you answer these queries? (线段树成段更新 && 开根操作 && 规律)
题意 : 给你N个数以及M个操作,操作分两类,第一种输入 "0 l r" 表示将区间[l,r]里的每个数都开根号.第二种输入"1 l r",表示查询区间[l,r ...
- hdu 4027 Can you answer these queries?
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Description Proble ...
- HDU 4027 Can you answer these queries?(线段树区间开方)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】
Can you answer these queries? Time Limit:2000MS Memory Limit:65768KB 64bit IO Format:%I64d & ...
- hdu 4027 Can you answer these queries? (区间线段树,区间数开方与求和,经典题目)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
随机推荐
- Dubbo源码解析之registry注册中心
阅读须知 dubbo版本:2.6.0 spring版本:4.3.8 文章中使用/* */注释的方法会做深入分析 正文注册中心是Dubbo的重要组成部分,主要用于服务的注册与发现,我们可以选择Redis ...
- Oracle不能并行直接添加主键的方法:先建唯一索引后建主键
环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 SQL ...
- 注解_Annotation
---恢复内容开始--- 一.什么是注解 注解,英文Annotation,它不是程序本身,是对程序的解释,在这里我会想到为什么不能使用注释呢,因为注解是关于程序对信息的处理的流程的一些说明,而且格式也 ...
- Hive表中的NULL值处理
1 MySQL 到 Hive 表的sqoop任务把 原本的NULL 变成字符串 ‘null’ 了 alter table ${table_name} SET SERDEPROPERTIES('seri ...
- 201772020113 李清华《面向对象程序设计(java)》第三周学习总结
一.测试题反思: 这次的测试题暴露出我在学习上的很多问题:首先,编程能力非常薄弱,编程题目只写出了第一个程序,还因为小问题通不过测试,以后一定要多上手练习,多阅读示例程序.其次,对理论知识的掌握不全面 ...
- PHP 调试打印输出变量
var_dump ($row); echo "hello"; echo "\n"; print_r ($arr); php 数组 对象 $arr = json_ ...
- unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度
var arr = [1, 2]; arr.unshift(0); //result of call is 3, the new array length //arr is [0, 1, 2] arr ...
- C++ 下面的AIDL
转自https://android.googlesource.com/platform/system/tools/aidl/+/brillo-m10-dev/docs/aidl-cpp.md. Bac ...
- 关于吴恩达机器学习支持向量机的问题,讲到对偶前有一个最小化f(w)使用拉格朗日求解时转化成一个最大的相等式的理解和一些困惑
(纯属个人理解) 参考: https://www.zhihu.com/question/267482928 https://www.cnblogs.com/90zeng/p/Lagrange_dual ...
- Docker 简介,入门
1.简介 Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行 ...