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操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
随机推荐
- 安装Jaspersoft Studio
下载位置:http://community.jaspersoft.com/project/jaspersoft-studio/releases.
- C语言-字符操作函数
1字符数组的初始化: 1.1 char string={'c','h','i','n','a'} 1.2char string={"china"}或者去掉{}即char strin ...
- jsp-简单的猜数小游戏
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- javascript简单计算器实践
参考部分资料,编写一个简单的计算器案例,虽然完成了正常需求,但是也有不满之处,待后续实力提升后再来补充,先把不足之处列出: 1:本来打算只要打开页面,计算器的输入框会显示一个默认为0的状态,但是在输入 ...
- 数据库limit子句
limit子句:用来限定语句执行结果的偏移量,有一个或者两个参数:第一个参数表示返回结果首行偏移量,第二个参数表示最大返回行数.例如:SELECT * FROM employees ORDER BY ...
- hihoCoder #1050 : 树中的最长路
题意: 求出树上最长路径的长度,并返回. 思路: 刚看到数据<=10^5,假如是单分支的树,那么有5万层,就不能递归,那就用桟实现, 那就要将长度信息保存在另开的数组中,很麻烦!!这题专门给递归 ...
- 洛谷 P2827 蚯蚓
题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...
- [转]maven项目部署到tomcat
其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...
- GWTDesigner_v5.1.0破解码
GWTDesigner_v5.1.0_win32_x86.exe破解码,双击运行keygeno.jar,然后输入用户名.网卡MAC,然后单击Generate,将生成的文件放在C:\Documents ...
- topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
A题,熊孩子测视力,水题,题意就是判断一下两个数对应位不相同的数字有多少个. #include<bits/stdc++.h> using namespace std; class Bear ...