CODEVS3550 不一样的根号算法

【面试算法题】给定整数n,求离根号n最近的整数 利用二分查找求解问题 阅读详情

大家都知道在OI算法当中复杂度大都是O(N)、O(N^2)、O(NlogN)......比较常见,而O(sqrt(n))的复杂度并不常见,只有分块、朝鲜树(似乎并不常用但确实复杂度带根号)但是在某些意想不到的地方,可以使用根号算法,不仅效果不错,还比较好写。

引出我们今天的题目CODEVS 3550,已知序列a_1,a_2,...a_i...,a_n,可以进行单点修改,(输入格式为(0,x,y)三元组,意即a_x=a_x+y),可以进行极值查询(输入格式为(1,x,d)三元组,意即查询a_x,a_x+d,a_x+2*d...a_x+k*d中最大值,其中满足x+k*d<=n并且x+(k+1)*d>n(通俗一点来说就是,查询一个首项为x,公差为d的等差数列的数组下标集合所对应的元素极值)

我们所学过的数据结构大多支持连续的区间查询,这样零散的数据怎么办呢。我们可以发现,如果公差d比较小,我们可以对于每种公差d建立d棵线段树,分别保存首项为1,2,......,n-1,n公差为d的下标集合所对应的数;但这种方法在d较大时会导致空间和时间的浪费。如果公差d比较大,我们可以直接暴力枚举。于是很容易想到把两种方法结合起来。那么问题来了,d的分界线在哪呢。

设d的分界限为K,序列长度为N,操作数为K,可以算出时间复杂度为O(N*K*logN(建树)+M*logN(线段树查询)+M*N/K(暴力查询)+M*K*logN(线段树修改)),我们发现这是一个对勾函数,当K=sqrt(M*N/(M+N)*logN),考虑到N与M大致相同,简化为sqrt(M/logN)。这样算法的复杂度变为O(M*sqrt(M*logN))。根号便奇怪的出现在了时间复杂度当中。

在实际实现过程当中,由于线段树常数过大,K应取小一点。

code:(考虑到上面的K太难算了,我取了个常数15= =)

#include<iostream>
#include<cstdio>
#include<cstring>
#define mid (l+r)/2
#define lch t,i<<1,l,mid
#define rch t,i<<1|1,mid+1,r
using namespace std;
int node[121][280001],n,m;
int a[70001],b[70001];
int f[16][16][2],ans;
void updata(int t,int i)
{
	node[t][i]=max(node[t][i<<1],node[t][i<<1|1]);
}
void build(int t,int i,int l,int r)
{
	if (l==r)
	  {
	    node[t][i]=b[l];
	    return;
	  }
	build(lch); build(rch);
	updata(t,i);
}
void insert(int t,int i,int l,int r,int x,int y)
{
	if (l==r&&l==x)
	  {
	    node[t][i]+=y;
	    return;
	  }
	if (x<=mid) insert(lch,x,y);
	else insert(rch,x,y);
	updata(t,i);
}
void query(int t,int i,int l,int r,int x,int y)
{
	if (x<=l&&y>=r)
	  {
	     ans=max(ans,node[t][i]);
	     return;
	  }
	if (x<=mid) query(lch,x,y);
	if (y>mid) query(rch,x,y);
}
int main()
{
	int n,m,i,j,k,t=0,opt,x,y,start,place,st;
	freopen("c.in","r",stdin);
	freopen("c.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;++i)
	  scanf("%d",&a[i]);
	for (i=1;i<=min(15,n);++i)
	  {
	    for (j=1;j<=i;++j)
	      {
	        b[0]=0;
	        t++;
	        f[i][j%i][0]=t;
	        for (k=j;k<=n;k+=i)
	          b[++b[0]]=a[k];
	        f[i][j%i][1]=b[0];
	        build(t,1,1,b[0]);
	      }
	  }
	scanf("%d",&m);
	for (i=1;i<=m;++i)
	  {
	    scanf("%d%d%d",&opt,&x,&y);
	    if (opt==0)
	      {
	        for (j=1;j<=min(15,n);++j)
	          {
	          	st=start=x%j; if (!st) st+=j;
	            if (x%j==0) place=(x-st)/j+1;
	            else place=(x-st+1)/j+1;
	            insert(f[j][start][0],1,1,f[j][start][1],place,y);
	          }
	        a[x]+=y;
	      }
	    if (opt==1)
	      {
	      	ans=-2147483647;
	      	if (y<=15)
	      	  {
	            st=start=x%y; if (!st) st+=y;
	            if (x%y==0) place=(x-st)/y+1;
	            else place=(x-st+1)/y+1;
			    query(f[y][start][0],1,1,f[y][start][1],place,f[y][start][1]);
			    printf("%d\n",ans);
		      }
		    else
		      {
		        for (j=x;j<=n;j+=y)
		          ans=max(ans,a[j]);
		        printf("%d\n",ans);
		      }
	      }
	  }
}
这道其实是CF#80 DIV1 D的加强版,原题为求和且并无修改操作。。。原题做法参见王悦同2014年国家集训队论文——《根号算法——不只是分块》
NOI 国家集训队论文 1999-2009 2013-2017 NOIP国家集训队论文集 1999-2009 2013 2015 2017 2014 2015 NOI 冬令营ppt 立即下载

相关推荐

开根号的几种算法实现

本代码实现了多种开根号算法,方便大家对比。

根号分治

根号分治 根号算法——不只是分块。 有时我们会碰到这样一类问题,长度为\(n\)的序列,\(m\)个询问(通常\(n\)和\(m\)同阶),可能存在两种比较显然的方法,一种是\(O(n^2)\)预处理\(O(1)\)回答,一种是不预处理\(O(n)\)回答\(m\)个询问,这两种方法都是\(O(n^2)\)的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。 看一道题:哈希冲突。 这是一道...

weixin_30488313的博客 1219

noi国家队集训论文

2017国家队集训论文集,提供oier和信息学奥赛的学习资料

求平方根(根号n)的两种算法——二分法和牛顿迭代

面试阿里口碑的时候遇到了这个问题,这里做个笔记1.二分法#define eps 0.00001 float SqrtByDichotomy(float n) { if (n &lt; 0) { return -1.0; } else { float low, up, mid, last; low = 0, up = (n&gt;=1?n:1); mid = (low + ...

u012677715的博客 1万+

OI国家集训队论文2009-2015打包下载

OI国家集训队论文2009-2015打包下载

算法_国家集训队论文集_part1(可单独下载)

国家信息竞赛集训队历年的论文,看看这帮算法达人理解的算法是什么样子的。

根号算法:分块

导入 众所周知,我们熟悉的算法时间复杂度有常数级,对数级、线性级、次方级、指数级等等,其中为应对题目规模对时间复杂度的要求,我们一般要将算法的时间复杂度优化到对数级,但是实际上我们还有一种优化方法——根号算法,它的时间复杂度为级,同样可以应对大部分的题目规模,并且具有相当大的可拓展性。和对数算法基本对应分治类似,根号算法也对应着一种操作,就是本篇博客要介绍的分块。 什么是分块? ...

yuhaomogui的博客 1303

ALTERA MAX10 FPGA 串口远程升级实战:从原理到烧录的避坑指南

本文详细解析了ALTERA MAX10 FPGA如何通过串口实现远程升级。文章从工程师实战经验出发,深入剖析了MAX10片内Flash的双镜像备份原理、CONFIG_SEL引脚启动机制,并重点介绍了使用On-Chip Flash IP核进行擦写操作的核心流程。同时,提供了从Quartus工程配置、RPD文件生成、串口协议设计到驱动代码编写的完整避坑指南,旨在帮助开发者稳定、高效地完成远程升级功能部署。

weixin_29197699的博客 273

根号类算法讲解——分块,莫队

一、分块 分块算法是比较常见的根号类算法,就是把数分成块换种形式暴力 先放题: 给你一个长度为n(n10510^5)的序列,有m个操作,操作涉及区间加和区间求和 这个东西可以做各种数据结构的裸题,肯定被各种切掉了吧… 考虑最暴力的思想,就是暴力更改统计每个区间 我们也可以将mm个元素分成一块,一共有k=n/mk=n/m块,对于区间的修改,枚举所有区间内包含的整块,将其打上加标记

谁能代表肯德基 2354

Streamlit安装避坑指南:从零到一键启动你的第一个数据可视化应用

本文提供了一份详尽的Streamlit安装避坑指南,帮助用户从零开始快速启动第一个数据可视化应用。文章深入剖析了安装过程中常见的网络超时、依赖冲突、环境变量缺失等核心问题,并给出了使用虚拟环境、配置国内镜像源、利用.whl文件离线安装等多种经过验证的解决方案,确保安装过程顺畅无阻。

weixin_29065015的博客 614

UE5 Metahuman与Blender手动绑定:ARKit面部动画实战对比

面部动画是角色动画领域的核心技术,其核心原理在于通过驱动面部骨骼或混合形状来模拟真实肌肉运动,从而赋予数字角色生命力。这项技术的价值在于极大地提升了虚拟角色的表现力与沉浸感,广泛应用于游戏开发、影视制作、虚拟现实和实时交互应用。在技术实现路径上,开发者常面临工业化集成方案与高度自定义方案的选择。本文聚焦于使用行业标准的ARKit 52个面部混合形状数据,深度对比了虚幻引擎Metahuman的工业化流程与Blender手动绑定方案在视觉保真度、工作流效率、性能开销和扩展性上的差异,为不同项目规模与技术需求的团

weixin_33901926的博客 449

根号算法(分块、莫队、根号分治)

分块是有很多套路的,当然也有很多变化。直接对序列本身分块。对值域分块对时间轴分块等等。上述三种是比较常见的。但是这只是最基础的,扩展有倍增值域分块、套用其他数据结构比如树状数组线段树一类的。这些就需要特别去练习了。特别需要注意的是分块与扫描线的结合。将分块挂在扫描线上是一种有很强的可扩展性的数据结构。其应用(特别是在Ynoi中)相当多。同时其本质清楚、画图的话结构比较明了,但有时难度相当大,需要勤加练习掌握套路。

weixin_42091043的博客 98

[官方培训]22-UE资产优化 Epic 肖月 笔记

Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。

Tcohneyn的博客 1574

『ACM』国家集训队论文集(最新)(1999-2017)(全)

更新10月13日: 链接:https://pan.baidu.com/s/13h3fhPZPAOJNxix99GXpSw 提取码:o8ex 国家集训队1999论文集 陈宏:《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》 来煜坤:《把握本质,灵活运用——动态规划的深入探讨》 齐鑫:《搜索方法中的剪枝优化》 邵铮:《数学模型的建立、比较和应用》 石润婷:《隐...

日拱一卒,功不唐捐 9990

从命令到对话:LLM如何重塑车载语音交互与软件定义汽车体验

自动语音识别和自然语言处理是智能交互的核心基础技术,它们使机器能够理解和响应人类语音指令。其原理在于通过声学模型和语言模型将声音信号转化为文本,再解析文本背后的用户意图。这项技术的价值在于提供了一种自然、高效且能解放双手的人机交互方式,极大地提升了在特定场景(如驾驶)下的安全性与便利性。随着技术演进,其应用场景已从简单的命令控制扩展到复杂的多轮对话和跨域任务执行。当前,软件定义汽车的架构变革为车载语音提供了统一的控制平台,而大型语言模型的引入则带来了范式革命,使其从功能触发器进化为真正的智能任务执行者。本文

weixin_42669344的博客 563

CAN基础知识

CAN基础知识

shouchen1的博客 9146

【codevs3119】高精度开根号(二分答案)

problem 高精度开根号 输入一个数 求平方根 solution 二分答案,如果mid*mid>原数就去找更小的,反之找更大的。 精度小于二忽略不计? 用到高精加,高精乘,加低精,除低精,比较大小这几个。 放弃调试,明天重写。 mmp codes1(更快的AC版本 //二分答案 #include<iostream> #i...

weixin_30695195的博客 399

SAP 供应商寄售(VMI)完整实现方案

摘要:本文详细讲解了SAP系统中供应商寄售(Consignment)和VMI(供应商管理库存)的实现方法。核心逻辑是物料所有权属于供应商,仅在领用时才触发采购。文章包含配置步骤(物料主数据、供应商设置、定价协议、会计科目等)、端到端操作流程(收货、库存查询、领用、结算、付款)、关键差异比较(与普通采购的区别)、核心事务码和数据表。重点说明了寄售流程无需采购订单,通过信息记录维护价格,领用时才产生应付账款的特点,并提供了常见问题解决方案和VMI进阶优化建议。

金牌架构师 1045

块状结构

作为一名资深蒟蒻,在OI比赛中想出题解为不可能事件,所以蒟蒻就须掌握一些高效的骗分方法 在骗分大家族中,块状结构以n√\sqrt n的较低复杂度和多功能以及“短”代码博得众多蒟蒻的欢迎 目前蒟蒻只知道三类块状结构:块状数组(分块),块状链表,块状树 块状数组(分块) ①分块 分块最直观的就是将一段区间分成若干块,每个块内拥有较多的数据,当需要集体修改时可以直接标记,当需要取出

测试运算符 1198

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

722

STM32F407中文手册

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

分块入门学习笔记

首先说明这篇博客写得奇差无比   让我们理清一下为什么要打分块,在大部分情况下,线段树啊,splay,treap,主席树什么的都要比分块的效率高得多,但是在出问题的时候如果你和这些数据结构只是混的脸熟的话,一旦错误可能就会导致心态崩溃,而且调试困难(大佬:很轻松啊....)所以,分块是一个时间效率不是很高的,代码量也不是很高的数据结构,水分是可以的,在全场都是30分的情况下,你能用分块水...

a6823202的博客 237

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

开根号的几类算法总结

首先是最基本的二分开根号,这个比较容易理解,复杂度比起下面讲的牛顿迭代法要高,更容易理解。 下面给出代码: #define eps 0.00001 float SqrtByDichotomy(float n) { if(n&lt;0) { return -1.0; } else { float low,up,m...

li198847的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

考点:时间复杂度(1)

绪论部分主要掌握时间复杂度,空间复杂度的分析 此篇文章基于王道2021版数据结构 时间复杂度: f(n) 一个算法重复执行次数的函数 O(f(n)) 算法的时间复杂度 比如: f(n)=n^3+n O(f(n))=n^3 如果直接给函数,算法时间复杂度可以一眼看出来,但如果给代码的话,就需要分析问题规模本身和输入数据的性质 加法法则: 针对并列程序 O(f(n1))+O(f(n2))=O( max(f(n1),f(n2)) ) 乘法法则: 针对嵌套程序 O(f(n1))*O(f(n

weixin_45962681的博客 4766

vscode输入特殊符号

&lt; 左尖角号&gt; 右尖角号&copy; ©版权&trade; ™商标&reg; ®商标 &#128515 emoji表情(自己可以改数字试一下) &nbsp;该空格占据宽度受字体影响明显而强烈&emsp;占据的宽度正好是一个中文宽度,而且基本不受字体影响 ...

qq_44559185的博客 5731

差分序列应用

差分序列是一种基于前缀和数组的神奇算法,在Rivendell神的教导下,我学会了这种神奇算法,先贴出Rivendell神博客的网址                                                                                                      http://www.cnblogs.com/Rivendell

Lcomyn的专栏 2814
上一篇: 【BZOJ 3110】【ZJOI 2013】K大数查询
下一篇: 【BZOJ 2038】【2009 国家集训队】小Z的袜子
Lcomyn
博客等级 码龄12年 14粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值