HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和。
思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的数开几次方之后都会变成1,所以到了1不用没完没了的更新。
//HDU 4027
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#define LL __int64
using namespace std ; LL p[ * ],lz[ * ] ;
void pushup(int rt)
{
p[rt] = p[rt << ] + p[rt << | ] ;
}
//void pushdown(int rt,int m)
//{
// if(lz[rt])
// {
// lz[rt << 1] = lz[rt << 1 | 1] = lz[rt] ;
// p[rt << 1] = (m - m/2) * lz[rt] ;
// p[rt << 1|1] = m/2 * lz[rt] ;
// lz[rt] = 0 ;
// }
//}
void build(int l,int r,int rt)
{
lz[rt] = ;
LL a ;
if(l == r)
{
scanf("%I64d",&a) ;
p[rt] = a ;
return ;
}
int mid = (l+r) >> ;
build(l,mid,rt << ) ;
build(mid+,r,rt << | ) ;
pushup(rt) ;
}
void update(int L,int R ,int l,int r,int rt)
{
if(p[rt] == r-l+)
return ;
if(l == r)
{
p[rt] = sqrt(p[rt]*1.0) ;
return ;
}
//pushdown(rt,r-l+1) ;
int mid = (l+r) >> ;
if(mid >= L)
update(L,R,l,mid,rt << ) ;
if(R > mid)
update(L,R,mid+,r,rt << | ) ;
pushup(rt) ;
}
LL query(int L,int R,int l,int r,int rt)
{
LL sum = ;
if(l >= L && R >= r)
return p[rt] ;
//pushdown(rt,r-l+1) ;
int mid = (l+r) >> ;
if(mid >= L)
sum += query(L,R,l,mid,rt << ) ;
if(mid < R)
sum += query(L,R,mid+,r,rt << | ) ;
return sum ;
}
int main()
{
int N,M,x,y,z ,casee = ;
while(cin >> N)
{
build(,N,) ;
scanf("%d",&M) ;
printf("Case #%d:\n",casee++) ;
while(M--)
{
scanf("%d %d %d",&x,&y,&z) ;
if(y > z)
swap(y,z) ;
if(x == )
{
update(y,z,,N,) ;
}
else
{
printf("%I64d\n",query(y,z,,N,) ) ;
}
}
puts("") ;
}
return ;
}
HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)的更多相关文章
- HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)
题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...
- 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? 线段树区间开根号,区间求和
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? 线段树
线段树+剪枝优化!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #includ ...
- hdu1754线段树的单点更新区间查询
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- hdu 5112 A Curious Matt
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5112 A Curious Matt Description There is a curious ma ...
- 【js类库AngularJs】web前端的mvc框架angularjs之hello world
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核 ...
- mousewheel滚轮事件
原生的滚轮事件:火狐与其他浏览器使用了不同的事件 /* * 滚轮事件只有firefox比较特殊,使用DOMMouseScroll; 其他浏览器使用mousewheel; * */ // firefox ...
- ios中如何计算(页数,行数,等等的算法)
页数 = (总个数 + 每页最大显示个数 - 1) / 每页显示最大的个数
- vnext 技术两篇文章和评论
研究vnext的两篇 好文章,重点看评论! http://www.cnblogs.com/shanyou/p/4589930.html http://www.cnblogs.com/shanyou/p ...
- ios 中使用SBJson拼接和解析json
1.ios解析json 使用开源json包,项目地址: http://stig.github.com/json-framework/ NSData * responseData = [res ...
- Swift function how to return nil
这两天在学习Stanford出品的iOS7的课程,这个课程去年也看过,但是看到第3课就不行了,满篇的OC,把人都搞晕了.这段时间因为要写个iOS的App,正好赶上了Swift问世,所以趁着这股劲继续学 ...
- EF4.1之基础(实现Code First)
Code First:顾名思义:就是通过代码生成数据库----通过类生成数据库中对应的表: 首先定义两个类(就是建模的过程): public class Order { public int Orde ...
- Linux Shell常用技巧(目录)
Linux Shell常用技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html一. 特殊文件: /dev ...
- html转义函数
public static String filter(String message) { if (message == null) return (null); char content[] = n ...