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操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
随机推荐
- Spark Mllib里决策树回归分析如何对numClasses无控制和将部分参数设置为variance(图文详解)
不多说,直接上干货! 在决策树二元或决策树多元分类参数设置中: 使用DecisionTree.trainClassifier 见 Spark Mllib里如何对决策树二元分类和决策树多元分类的分类 ...
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">报错
https://blog.csdn.net/qq_36611526/article/details/79067159 今天遇到个问题 文件内引入某个资源 pom.xml头部http://maven.a ...
- svn检出项目报错
首先,我在浏览器访问svn检出项目地址是正常的,那么应该就是svn缓存的问题 1. 右键点击本地副本,TortoiseSVN -> Settings -> Saved Da ...
- c#基础值类和引用类型
//值类型:int double char decimal bool enum struct //引用类型:string 数组 自定义类 集合 object 接口 值传递传递的值得本身 引用传递传递的 ...
- JAVA代码之斗地主发牌
理解很好理解,关键是思路 按照斗地主的规则,完成洗牌发牌的动作: 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. ...
- SpringBoot 2.x (13):整合ActiveMQ
ActiveMQ5.x不多做介绍了,主要是SpringBoot的整合 特点: 1)支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议 2)支持许多高 ...
- ionic 2 起航 控件的使用 客户列表场景(四)
接下来,我们的客户列表要怎么刷新数据呢? 我们不会安卓开发,不会ios开发,没关系,我们还有ionic 2.ionic 2的控件 Ion-refresher 轻松帮我们搞掂. <!--下拉刷新- ...
- BZOJ 4896 :[Thu Summer Camp2016]补退选 Trie树+Vector
4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 315 Solved: 97[Submi ...
- phar打包项目压力对比测试
工具 http_load 测试url: http://api.test.chaoma.me/agent/ad/good_goods/query http://api.test.chaoma.me/ag ...
- 从PEP-8学习Python编码风格
(搬运自我在SegmentFault的博客) 关于空行 类与顶级函数(top-level function)的定义之间应当空两行. 类中的方法之间应当空一行. 方法中的逻辑部分之间可以空一行. 关于原 ...