hdu4027 线段树啦啦啦

海战(线段树)- HDU 4027         这一篇是典型的线段树算法,这个算法在日常工作中可能非常少见,因为可以被常规算法所取代,但是在问题达到一定数量级之后,常规算法是很难搞定类似问题的,可以说线段树是高级算法中非常低调的一种,也许在某些关键时刻能让你化险为夷。         线段树简单的说就是对一个序列每次从中间划分为2个区间,然后依次划分子区间。如图:         先看下维基百科的说明:        ... 阅读详情

题意:

查询:【l,r】数列的和

修改:【l,r】ai->向下取整sqrt(ai)

思路:

修改:暴力更新到叶子

剪枝:只要区间内所有数都是1就不用向下更新了

即sum==r-l+1

或者维护区间最大值来判断也可以

难度0.6

733ms

//hdu4027  区间修改:区间内所有数开根号下取整,区间查询:加法和
//思路:维护sum 暴力修改叶子,回溯时pushup修改其他非叶子节点,
//剪枝:修改时若当前sum为numr-numl+1(每个数都是1)且当前区间是修改区间的子区间,那么可以不递归下去 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long
struct stree{
	ll sum;
}sts[100005*4];
ll a[100005];
void pushup(int root)
{
	sts[root].sum=sts[root<<1].sum+sts[root<<1|1].sum;
}

void build(int l,int r,int root)
{
	if(l==r)
	{
		sts[root].sum=a[l];
	}
	else
	{
		sts[root].sum=0;
		int mid=(l+r)>>1;
		build(l,mid,root<<1);
		build(mid+1,r,root<<1|1);
		pushup(root); 
	}
}
void update(int nowl,int nowr,int ul,int ur,int root)
{
	if(nowl==nowr)
	{
		sts[root].sum=sqrt(sts[root].sum);
	}
	else
	{	
		if(ul<=nowl&&ur>=nowr&&sts[root].sum==nowr-nowl+1)return ;//当前区间在修改区间之内 
		int mid=(nowl+nowr)>>1;
		if(ul<=mid)update(nowl,mid,ul,ur,root<<1);
		if(ur>mid)update(mid+1,nowr,ul,ur,root<<1|1);
		pushup(root);
	}
	
}
ll query(int nowl,int nowr,int ql,int qr,int root)
{
	if(ql<=nowl&&qr>=nowr)
	{
		return sts[root].sum;
	}
	else
	{
		ll ans=0;
		int mid=(nowl+nowr)>>1;
		if(ql<=mid)ans+=query(nowl,mid,ql,qr,root<<1);
		if(qr>mid)ans+=query(mid+1,nowr,ql,qr,root<<1|1);
		return ans;
	}
}
void op();
int main()
{
	
	int n;int kase=0;
	while(~scanf("%d",&n))
	{
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
		}	
		int q;build(1,n,1);
		op();
		scanf("%d",&q);int type,l,r;
		
		printf("Case #%d:\n",++kase);
		for(int i=1;i<=q;i++)
		{
			scanf("%d %d %d",&type,&l,&r);
			if(l>r)swap(l,r);
			if(type==1)
			{
				printf("%lld\n",query(1,n,l,r,1));
			}
			else
			{
				update(1,n,l,r,1);
				op();
			}
		}
		printf("\n");
	}

}

void sp(int t)
{
	for(int i=1;i<=t;i++)
	printf(" ");
}
void op()
{
	int pow2[10]={1,2,4,8,16,32};int n=16;
	printf("\n///////////\n");
	for(int i=1; i<=31; i++)
	{
		if(i==pow2[0])sp(15);
		if(i==pow2[1])sp(7);
		if(i==pow2[2])sp(3);
		if(i==pow2[3])sp(1);
		if(i>pow2[1]&&i<pow2[2])sp(15);
		if(i>pow2[2]&&i<pow2[3])sp(7);
		if(i>pow2[3]&&i<pow2[4])sp(3);
		if(i>pow2[4]&&i<pow2[5])sp(1);
		printf("%d",sts[i].sum);
		if((i==pow2[1]-1)||(i==pow2[2]-1)||(i==pow2[3]-1)||(i==pow2[4]-1))
			printf("\n");
	}
	printf("\n\n///////////\n");
}


SAP-MM:SAP MM(物料管理)模块 的系统化学习计划 SAP MM模块的系统化学习计划 阅读详情

相关推荐

西门子【Automation Framework V1.2】AF架构:从软件栈到高效自动化项目的构建蓝图

本文深入解析西门子Automation Framework V1.2 (AF架构) 的核心价值与实施蓝图。该框架通过定义标准化的软件栈(如TIA Portal V19、STEP7、WinCC Unified)和严格的安装配置流程,将自动化项目开发从依赖个人经验的“手工作坊”模式,转变为高效、可复制的工业化模式。遵循此架构,工程师能快速构建稳定可靠的项目基础,规避环境冲突,从而专注于核心工艺与逻辑设计,大幅提升团队协作与项目交付效率。

weixin_29230059的博客 428

HDU4027 (线段树简单题)

vj的题目链接:https://cn.vjudge.net/problem/HDU-4027 题目大意:对一个n个数的序列进行两种操作:1、将某个区间的每个数开方。2、查询某个区间中所有数的和 解题思路:区间修改、查询的问题显然是用线段树来来维护了。这题是不能用延迟标记来完成区间修改的,因为先求和再开方与先每个数开方再求和的结果是不同的。于是对于一次区间更新的操作,只能将每个点单点更新,但这样的时...

Apale_8的博客 528

【OTDR曲线工具箱】04 批量生成sor文件

软件下载地址:http://120.78.150.214:9999/isora.zip 通过一个测试数据sor文件,批量生成多个测试文件(基于Bellcore GR196及SR-4731标准)。主要考虑哪些问题: 1、sor测试是否符合要求(主要是衰减系数) 2、多个文件的创建时间 3、文件必须随机处理,不要看省去一模一样。 来说说怎么操作的 第一步:选择参考曲线 参考曲线的选择由两种方法:从文件中导入、从曲线库中选择。 其中曲线库分为公共库和个人库两种,平时浏览的sor文件都可以加载到库中。 第二步

夜晚是传说的博客 5267

HDU-4027(线段树)

HDU - 4027 The 36th ACM/ICPC Asia Regional Shanghai Site 题目描述思路代码 题目链接:hdu-4027. 题目描述 一个长度为 nnn 的整数序列 a1,a2,...ana_{1},a_{2},...a_{n}a1​,a2​,...an​. 有mmm个操作,每个操作为 si,li,ris_{i}, l_{i},r_{i}si​,li​,ri...

Neromy 896

立创开源PEX88048 8盘位M.2扩展卡硬件设计与PCIE4.0交换机应用解析

本文详细解析了基于Broadcom PEX88048 PCIe 4.0交换芯片的8盘位M.2扩展卡硬件设计。文章深入探讨了核心芯片选型、关键供电与安全设计、引脚配置、固件刷写方法,并重点剖析了PCIe 4.0时钟架构与高速PCB布局的核心思想,旨在帮助开发者理解如何设计高性能、高可靠性的存储扩展方案,并有效控制成本。

weixin_28949937的博客 617

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

HDU 4027 【线段树区间开根号】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 这道线段树的题目我并没有按照线段树的模板写,这里把要点讲出来就行了。 第一:区间开根号不像区间乘或者除,能通过区间和然后一次性乘除求出一个区间的乘除,所以区间开根号只能一个一个的开,但是如果一个一个的开不会超时吗? 假设一个数在long long的范围里面,也就是2^63这个范围内,那么对这...

Y390d的博客 1677

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

hdu4027

std;typedeflong longll;constintN1e55;structbttreeintlr;ll sum;tN<<2intlsintp){returnp<<1;intrsintp) {returnp<<11;ll aNvoidbuildintpintlintrtp] = {lr0ifl==rtp].sumal。

wansanxun的博客 195

【Java开发者必看】LangChain4j实战指南:使用AIService轻松集成聊天记忆Chat Memory到SpringBoot应用,通过封装多轮复杂对话,使聊天记忆的实现变得简单

聊天记忆是指在与用户的多轮对话过程中,能够记住之前的交互内容,从而提供更加连贯和个性化的回复。LangChain4j支持通过ChatMemoryProvider接口实现聊天记忆功能。

Spring Boot-Common On With You 448

uv pip install时出现error: Request failed after 3 retries 解决方案

本文主要介绍了uv pip install时出现error: Request failed after 3 retries解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方法一 2.2 方法二

weixin_43178406的博客 12万+

Hdu4027(线段树开根号区间求和)

题意: 给定100000个数,两种操作, 0 i j表示将i j这段的数字都开根号(向下取整) 1 i j表示查询i j之间的所有值的和 所有的和都不超过64位 思路: 如果直接用线段树更新会tle,此题的关键是要理解对任何64位以内的值,开根号最多不会超过7次,所以用线段树做,更新到叶子节点的次数最多7次,如果叶子节点已经更新为1了,那么再开根号也不会变了。 #include <cstdi...

CY05627的博客 709

UniApp 覆盖安装后首次进入 APP pages.json 不生效的解决方案

通过以上步骤,解决了缓存问题导致的首次加载异常。此方案的关键在于强制更新文件名,从根本上避免旧缓存的干扰。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 681

hdu4027题解——线段树

hdu4027题解——线段树 题意: n个数,m次询问: 0 l r :将[l, r]内的数取根号并向下取整。 1 l r :输出[l, r]区间和。 思路:线段树,维护区间和。 坑点:l 可能会大于 r,需要剪枝,否则直接TLE,当值为1时不需要再取根号了,剪枝后500ms左右。 #include <bits/stdc++.h> using namespace std; ty...

D_Bamboo_的博客 344

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

HDU-4027 线段树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 题目大意: 给你一个初始序列a[i],然后有两个操作,一个是询问区间的和,一个是将区间里的每一个数变为原来的平方根,向下取整。操作数<=100000 思路 给定的数初始最大为\(2^{63}\),那么我们最多取6次平方根就可以将其变为1,变成1之后不管怎么取都是1,所以考虑使用线段树维护一...

lalala445566的博客 200

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

HDU4027(线段树)

hdu4027本质上就是一个更新区间的问题,只要弄明白一个小技巧,加上躲过一些坑点,就能AC了 首先通过题目分析可以推出这样一个规律:每艘战舰的寿命在最多经过7次开方后就会变成1,所以在我们每次更新区间的时候,首先要加一个判断条件 tree[i].sum与tree[i].r-tree[i].l+1时否相等,如果相等了,那么说明在这个树的下面的节点全部都是1,这种树就不再需要更新了,直接返回就好 ...

Joker的博客 418

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Can you answer these queries?( HDU - 4027,线段树 + 细节)

一.题目链接: HDU-4027 二.题目大意: n 个数. 有两种操作. 0 X Y:将区间 [X, Y] 的数开方(向下取整) 1 X Y:查询区间 [X, Y] 的和. 三.分析: 直接线段树单点更新会 TLE,由于根号 7 次后向下取整为 1. 所以只需要记录每段区间被更新过的次数. 注意:所给的 X,Y 大小关系不确定因为这里 WA 了三天啊啊啊啊啊啊 555....

The___Flash的博客 288

hdu 4027(线段树区间开方求和)

本来很早就做了这道题的,但是今天突然发现了. 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4027 解法:首先这道题的数据就告诉我们只能用线段树,但区间操作似乎很蛋疼,我当时想的是用lazy标记记录这段区间要开方几次,等query时在统一进行单点更新,然后…….我就T了,如果update一次query一次,我的lazy标记便并卵了,所以我们需要想更

chen20000804的博客 1973

HDU-4027-Can you answer these queries?(暴力线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 题目大意:n个数,两种操作,0.将[l,r]内的所有数开平方(四舍五入取ll),1.求[l,r]内的sum 思路:线段树板子,首先需要更新到最下面,1开平方还是1,所以一个数最多更新64次,然后记录一下是否需要开平发即可。 ACCode: #include<stdlib.h&gt...

永远鲜红の幼月的博客 324

hdu4027 线段树单点更新

/* hdu 4027 单点更新,每次更新到最底层 1、剪枝,因为每次都是减少到根号,所以小于等于1就不用再更新了 */ #include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<cstdlib> #inclu...

甦萌的博客 402

Can you answer these queries? HDU 4027 线段树

Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来值开根号下的值。有两种操作,第一种就是上面描述的那种,第二种就是询问某个区间内的船的战斗值的总和。 解题思路 使用线段树就不用多说了,关键是如果不优化的话会超时,因为每次修改都是需要递归...

weixin_30715523的博客 175

HDU_4027_线段树区间开方

HDU 4027 剪枝:开方等于7次,值等1 以为每个点的值不一样,所以开方是要每个点开方,不能延迟标记 long long存sum 看别人博客:x居然可以>y #include <iostream> #include <string.h> #include <cmath> using namespace std; const int maxn = ...

_llc的博客 213

HDU - 4027(线段树+思维)

hdu4027 分析:由于数不超过2^63,因此开个七八次就变成1,由于只有开方,没有修改操作,直接暴力开方,对于sum[i]<=r-l+1的区间不作处理(再开也没意义了)(其实不会出现sum[i]<r-l+1的情况) 代码: #include #include #include #include #include #include #include #include #include...

qq_41856950的博客 334

HDU - 4027 Can you answer these queries? (线段树)

题目传送门:HDU - 4027 Can you answer these queries? 题目大意: 存在n艘敌军战舰,每艘战舰都有能量值,我军存在一种秘密武器,每次能够将在该区间内的所 有战舰的能量值开方,现在指挥官想要知道武器的效果,需要你告诉他该区间内敌军战舰的能 量值之和 分析: 该题对区间进行操作,显然是用线段树。两个操作分别是对区间进行开方和区间求和,对区间中战舰的能...

weixin_34166472的博客 79

Can you answer these queries? HDU - 4027

Can you answer these querites? HDU - 4027 普通的线段树题,但是有一个问题是,区间更新时,因为必须更新每个点,才能更新区间,那么线段树更新就很慢了,无法使用lazy数组。有一个小技巧是当区间和等于区间长度时,那么说明已经到最好的情况了,不用再修改了。这一步简化后就可以过了 如果写线段树可以像喝水一样自然就好了 1 #include <...

weixin_30886233的博客 123

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

HDU - 4027  http://acm.hdu.edu.cn/showproblem.php?pid=4027 题意:更新的时候把要求区间内的值都更新为自己开根号,查询时查询区间和。 思路:  感觉自己有个不好的习惯,有题目没思路时老是容易去看题解或是discuss,这个习惯真的要改一下。 这个题由于是根号,所以必须得更新到点,然后会发现,每次开根号一个数会很快变成1,这时再对这段区间

shinimashzi 234
上一篇: POJ3264 线段树
下一篇: hdu4912 LCA(ST)+???+贪心
animalcoder
博客等级 码龄9年 43粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值