给定一个长度为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?(线段树)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

    题目 线段树 简单题意: 区间(单点?)更新,区间求和  更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...

  4. hdu 4027 Can you answer these queries? 线段树

    线段树+剪枝优化!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #includ ...

  5. HDU 4027 Can you answer these queries? (线段树成段更新 && 开根操作 && 规律)

    题意 : 给你N个数以及M个操作,操作分两类,第一种输入 "0 l r" 表示将区间[l,r]里的每个数都开根号.第二种输入"1 l r",表示查询区间[l,r ...

  6. hdu 4027 Can you answer these queries?

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Description Proble ...

  7. HDU 4027 Can you answer these queries?(线段树区间开方)

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

  8. HDU 4027—— Can you answer these queries?——————【线段树区间开方,区间求和】

    Can you answer these queries? Time Limit:2000MS     Memory Limit:65768KB     64bit IO Format:%I64d & ...

  9. hdu 4027 Can you answer these queries? (区间线段树,区间数开方与求和,经典题目)

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

  10. HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)

    题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...

随机推荐

  1. 爬虫(Xpath)——爬tieba.baidu.com

    工具:python3 核心知识点: 1)lxml包不能用pip下载,因为里面有其他语言编写的文件 2)urlopen返回的请求是html文件,要使用 content = etree.HTML(html ...

  2. 《从0到1学习Flink》—— 如何自定义 Data Source ?

    前言 在 <从0到1学习Flink>-- Data Source 介绍 文章中,我给大家介绍了 Flink Data Source 以及简短的介绍了一下自定义 Data Source,这篇 ...

  3. Android tess_two Android图片文字识别

    文字识别一般都用的tesseract-ocr. GitHub:https://github.com/tesseract-ocr/tesseract 而Android对应的比较推荐的有个tess-two ...

  4. zabbix2升级zabbix3

    1.停服zabbix2,停服数据库/etc/init.d/zabbix_server stop/etc/init.d/mysqld stop 2.物理备份数据库cd /var/lib/mysql/ta ...

  5. POJ 3017 Cut the Sequence (单调队列优化DP)

    题意: 给定含有n个元素的数列a,要求将其划分为若干个连续子序列,使得每个序列的元素之和小于等于m,问最小化所有序列中的最大元素之和为多少?(n<=105.例:n=8, m=17,8个数分别为2 ...

  6. 使用JDK自带的VisualVM进行Java程序的性能分析

    VisualVM是什么? VisualVM是JDK自带的一个用于Java程序性能分析的工具,JDK安装完毕后就有啦,在JDK安装目录的bin文件夹下能找到名称为jvisualvm.exe. 要使用Vi ...

  7. WPF知识点全攻略11- 命令(Command)

    先看一下命令的简单使用: <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Cut ...

  8. wxWidgets:处理wxEVT

    我们仍然以继承于wxFrame的MyFrame作为例子. MyFrame.h: class MyFrame : public wxFrame { ...... private: ...... void ...

  9. 2004: C语言实验——数日子(数组)

    2004: C语言实验——数日子 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 213  Solved: 111[Submit][Status][Web ...

  10. 【0624课外作业】将一个double类型的小数,四舍五入保留两位小数

    package com.work0624; /** * 课外作业 *将一个double类型的小数,四舍五入保留两位小数 * @author L * */ import java.util.Scanne ...