HDU - 4027 Can you answer these queries?(线段树)
给定一个长度为n的序列,m次操作。
每次操作
可以将一个区间内的所有数字变为它的根号。
可以查询一个区间内所有元素的和。
线段树的初级应用。
如果把一个区间内的元素都改为它的根号的话,是需要每个数字都进行修改的。这样就会超时。
一个优化就是区间修改的当区间时,若区间长度等于区间和,那这个区间里的所有元素都不用修改了。
而题目中区间里的元素之和最大是 2^63,时间完全够用。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
#define maxn 100000 + 1000
#define LL long long
#define in_int(x) int x; scanf("%d", &x); struct Sect
{
int l, r, flag;
LL sum;
Sect() : flag() {}
}
t[*maxn]; LL
n, a[*maxn]; void build(int id, int l, int r)
{
if (l == r)
{
t[id].sum = a[l];
t[id].l = l, t[id].r = r;
return;
}
int mid = (l+r) >> ;
build(id*, l, mid);
build(id*+, mid+, r);
t[id].sum = t[id*].sum + t[id*+].sum;
t[id].l = t[id*].l, t[id].r = t[id*+].r;
} //void update(int id, int x, int val)
//{
// if(t[id].l == t[id].r)
// {
// if (t[id].l == x) t[id].sum += val;
// return;
// }
// int mid = (t[id].l+t[id].r) >> 1;
// if (x <= mid) update(id*2, x, val);
// else update(id*2+1, x, val);
// t[id].sum = t[id*2].sum + t[id*2+1].sum;
//} //void markdown(int id)
//{
// t[id].flag = 0;
// t[id].sum = (int)sqrt(t[id].sum);
// if (t[id*2].flag) markdown(id*2);
// t[id*2].flag = 1;
// if (t[id*2+1].flag) markdown(id*2+1);
// t[id*2+1].flag = 1;
//} LL query(int id, int l, int r)
{
//if(t[id].flag) markdown(id);
if (t[id].l >= l && t[id].r <= r) return t[id].sum;
int mid = (t[id].l + t[id].r) >> ;
if (r <= mid) return query(id*, l, r);
else if (l > mid) return query(id*+, l, r);
else return query(id*, l, mid) + query(id*+, mid+, r);
} void change(int id, int l, int r)
{
if (t[id].l == t[id].r)
{
t[id].sum = sqrt(t[id].sum);
return;
} if (t[id].r - t[id].l + == t[id].sum) return; int mid = (t[id].l + t[id].r) >> ;
if (r <= mid) change(id*, l, r);
else if (l > mid) change(id*+, l, r);
else
{
change(id*, l, mid);
change(id*+, mid+, r);
} t[id].sum = t[id*].sum + t[id*+].sum;
} int main()
{
int n, ca = ;
while(scanf("%lld", &n) != EOF)
{
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]); build(, , n); printf("Case #%d:\n", ++ca);
in_int(m); for (int i = ; i <= m; i++)
{
in_int(x);
in_int(l);
in_int(r); if (l > r) swap(l, r);
if (x) printf("%lld\n", query(, l, r));
else change(, l, r);
}
printf("\n");
}
}
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操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
随机推荐
- xxx cannot be resolved to a type
1.jdk不匹配(或不存在) 项目指定的jdk为“jdk1.6.0_18”,而当前eclipse使用的是“jdk1.6.0_22”.需要在BuildPath | Libraries,中做简单调 ...
- 9、数值的整数次方------------>剑指offer系列
数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 这道题逻辑上很简单,但很容易出错 关键是要考虑全面,考虑到所有情况 ...
- redis 大批量数据插入导致MISCONF Redis is configured to save RDB snapshots的解决
PS:之前写过一遍,那个方法没有彻底解决,现找到真正的解决方法 环境:redis 3.2.100 windows版(注意!!!这是关键),win10,redis客户端spring boot 2.0.7 ...
- Typedef 用法
typedef声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法. 不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用typedef避免缺欠,从而使代码更健壮. ...
- db2数据库创建索引,删除索引,查看表索引,SQL语句执行计划以及优化建议
1.建立表索引 create index 索引名 on 表名(列名,列名); 2.删除表索引 drop index 索引名 on 表名; 3.查看表索引 select * from sysibm.sy ...
- Postgres 9.11 网络地址类型函数和操作符
9.11. 网络地址类型函数和操作符 Table 9-31 显示了可以用于 cidr 和 inet 的操作符. 操作符 <<,<<= >>,和 >>= ...
- GWT module 'xxx' may need to be (re)compiled解决办法
使用GWT Eclipse Plug-in开发GWT应用,启动程序,在浏览器地址栏中输入http://127.0.0.1:8888/HelloWorld.html,没有出现我所期望的结果,而是弹出如下 ...
- Android(java)学习笔记132:eclipse 导入项目是提示:某些项目因位于工作空间目录中而被隐藏。
导致这个错误的原因是工程重名了: 并不是仅仅指文件夹重名,相信很多人也曾经修改过文件夹的名称,可惜没什么用处,关键是修改工程里面的一个文件! 也就是.project这个文件! 用记事本打开,修改一下& ...
- groupadd - 建 立 新 群 组
总览 SYNOPSIS groupadd [-g gid [-o]] [-r] [-f] group 描述 DESCRIPTION groupadd 可 指 定 群 组 名 称 来 建 立 新 的 群 ...
- Array - Two Sum
import java.util.HashMap; import java.util.Map; /** * 分析: * 普通实现-嵌套循环两次,时间O(n2),空间O(1) * 复杂实现-循环一次,时 ...