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操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
随机推荐
- Funsioncharts 线图 破解
在线示例:http://jsfiddle.net/henley/xnozyLa8/2/ 下载:http://files.cnblogs.com/files/ycdx2001/chart.zip
- Jquery3
动画 动画动画效果一:show(时间),hide(时间)说明:时间的单位为毫秒方法toggle(时间):使用动画切换显示与隐藏动画效果二:slideDown(时间),slideUp(时间)切换:sli ...
- 模态框的理解 ,jQ: loading,进度条, 省级联动 表单验证 插件
模态框: 打开一个弹框 不关闭它就不能做框外的操作 必须关闭或弹出另外的弹框 加载延迟loading + 进度条只要有请求 就处理一下监控ajax 全局事件jquery: $('#box').ajax ...
- PHP超全局变量、魔术变量和魔术方法
PHP超全局变量 $_GET 通过get方式传递的值(通过 URL 参数传递给当前脚本的变量的数组.) $_POST 通过post形式传递的值(当 HTTP POST 请求的 Content-Type ...
- Hive基础(1)
Hive基础(1) Hive的HQL(2) 1. Hive并不是分布式的,它独立于机器之外,类似于Hadoop的客户端. 2. 元数据和数据的区别,前者如表名.列名.字段名等. 3. Hive的三种安 ...
- [SecureCRT]通过SFTP方式上传本地文件到服务器
1.在本地建一个文件夹,如:d:\My Documents,在此目录下,放入我们需要上传的文件,如:nmon_linux_x86_64 2.然后打开我们的SecureCRT工具,一次选择Options ...
- 分享一些关于Lucene的心得
Lucene的概述 Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实 ...
- Android(java)学习笔记105:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...
- 树莓派 - 修改pi账号密码,开启root账号
1.修改PI账号的密码 password pi 2.开启root账号 树莓派使用的Linux是debian系统,所以树莓派启用root和debian是相同的. debian里root账户默认没有密码, ...
- 01_1_jdom调用xml文件
01_1_jdom调用xml文件 1. 导入jdom.jar包 2. xml文件内容 test.xml <?xml version="1.0" encoding=" ...