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");
}


分数间隔均衡器的基本原理及应用(使用Matlab) 通过对接收信号进行加权求和,分数间隔均衡器可以抵消信号在传输过程中受到的频率响应失真。Matlab提供了丰富的工具和函数,可以方便地实现分数间隔均衡器,并进行性能评估。分数间隔均衡器(Fractional Interval Equalizer)是一种数字信号处理技术,用于均衡带通信道中的信号失真。分数间隔均衡器的基本原理是通过对接收信号进行加权求和,以抵消信号在传输过程中受到的频率响应失真。分数间隔均衡器在通信系统中具有广泛的应用。最后,我们通过比较均衡后的信号和发送数据的阈值来进行解调,并计算误码率。 阅读详情

相关推荐

SAP采购信息记录批量维护实战:用BAPI ME_INFORECORD_MAINTAIN搞定价格等级和条件记录

本文深入解析SAP标准BAPI ME_INFORECORD_MAINTAIN在采购信息记录批量维护中的应用,特别聚焦价格等级和条件记录的技术难点。通过实战案例和代码示例,帮助用户高效处理供应商-物料价格数据,提升供应链管理效率。

weixin_42522320的博客 410

HDU4027 (线段树简单题)

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

Apale_8的博客 528

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置)

本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。

weixin_29213827的博客 538

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

告别反复格式化!用Ventoy制作2025年终极启动盘,Windows/Linux/macOS一网打尽

本文详细介绍了如何使用Ventoy制作2025年终极多系统启动盘,彻底告别反复格式化U盘的烦恼。Ventoy通过创新的引导加载器架构,允许用户在一个U盘内同时存放并直接启动Windows、Linux、macOS等多种系统镜像和WePE等维护工具,实现真正的非破坏性管理和极高的U盘利用率。文章涵盖从安装配置、镜像库构建到安全启动设置等全流程实战指南。

weixin_29280219的博客 241

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 429

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

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

Y390d的博客 1677

全面讲解电子齿轮比与脉冲数计算

什么是编码器分辨率。

viixin的博客 1万+

hdu4027

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

wansanxun的博客 195

CPU性能优化实战:寄存器重命名如何解决指令冲突(附3种实现方案对比)

本文深入解析了CPU性能优化中的关键技术——寄存器重命名,详细阐述了其如何通过物理寄存器堆(PRF)和重命名映射表(RAT)解决WAW、WAR、RAW等指令冲突,从而释放超标量处理器的并行潜力。文章重点对比了基于ROB、ARF扩展和统一PRF三种主流实现方案的设计权衡、电路代价与功耗影响,并探讨了现代处理器中并行重命名与状态恢复的实战机制。

weixin_29252171的博客 265

嵌入式系统开发笔记101:STM32CubeIDE安装过程中的2个错误及其解决方法

STM32CubeIDE在安装过程中,遇到了2个错误,本文阐述其解决方法。产生上述错误的原因,都在于中文。STM32CubeIDE不能很好的支持中文,所以在使用STM32CubeIDE进行项目设计的过程中,不要使用中文,包括项目所在的路径。

snmplink的博客 8552

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

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

CY05627的博客 709

史上最牛逼的导航网站(很全很详细)

今天,给大家推荐47个聚合型的导航网站 每一个都收录上百个网站,1个能顶100个,丝毫没有夸张的成分。 (推荐收藏) 设计师导航网站 01 优设导航 https://hao.uisdc.com/ 设计师必备的导航网站,包含设计工具、素材资源、字体设计、配色方案、酷站模板等。 界面清晰无广告,收录网站超过520个。 02 设计导航 http://h...

孙叫兽的博客 7万+

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

HDU-4027 线段树

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

lalala445566的博客 200

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

HDU4027(线段树)

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

Joker的博客 418

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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、付费专栏及课程。

余额充值