首页 > 其他分享 >Ynoi 做题记录

Ynoi 做题记录

时间:2024-05-24 21:07:10浏览次数:16  
标签:记录 int sum Ynoi sqrt 修改 add

[Ynoi2011] 初始化

第一道通过的 Ynoi 题,虽然似乎大概也许并不太难

题目分析

查询操作为求区间和,可以使用分块。

看到这种修改操作满足“跳着加”性质的题目,可以尝试根号分治。

那么如何进行根号分治呢?

当 \(x \ge \sqrt{n}\) 时,需要修改的位置最多有 \(\sqrt{n}\) 个,故可以暴力地修改。

当 \(x < \sqrt{n}\) 时,需要使用另外一种方式维护:

观察需要修改的位置不难发现,假如我们把原数列分成块长为 \(x\) 的若干个块,那么修改操作相当于在每个块内的第 \(y\) 个位置上加 \(z\),定义 \(f_{i,j}\) 表示当 \(x=i\) 时,每个块内的第 \(j\) 个位置上一共被加了多少,然后定义 \(add_{i,j}\) 满足 \(add_{i,j}=\sum^{j}_{k=1}f_{i,k}\),于是查询操作的结果可以表示为:

\[\sum^r_{i=l}a_{i}+\sum^{\sqrt{n}}_{i=1}(add_{i,i} \times (\lfloor \frac{r}{i} \rfloor - \lfloor \frac{l-1}{i} \rfloor) + add_{i,r \bmod i} - add_{i,(l-1) \bmod i}) \]

其中,\(\sum^r_{i=l}a_{i}\) 可以通过分块快速求出。

卡常小技巧:本题的需要维护的各种数据都不会超过 long long 类型的上限,所以对于查询操作,可以在求得结果后再进行取模。

部分代码

inline void change(int x,int y,int z){
	if(x>=t){
		for(register int i=y;i<=n;i+=x){
			a[i]+=z;
			sum[pos[i]]+=z;
		}
	}
	else for(register int i=y;i<=x;i++) add[x][i]+=z;
}
inline long long ask(int l,int r){
	long long ans=0;
	int p=pos[l],q=pos[r];
	if(p==q){
		for(register int i=l;i<=r;i++){
			ans+=a[i];
		}
	}
	else{
		for(register int i=p+1;i<=q-1;i++) ans+=sum[i];
		for(register int i=l;i<=R[p];i++) ans+=a[i];
		for(register int i=L[q];i<=r;i++) ans+=a[i];
	}
	for(register int i=1;i<=t;i++){
		ans+=add[i][i]*(r/i-(l-1)/i)+add[i][r%i]-add[i][(l-1)%i];
	}
	return ans;
}
int main(){
	n=read();
	m=read();
	for(register int i=1;i<=n;i++) a[i]=read();
	t=sqrt(n);
	for(register int i=1;i<=t;i++){
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}
	if(R[t]<n){
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++){
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
	while(m--){
		int t1=read();
		if(t1==1){
			int t2=read(),t3=read(),t4=read();
			change(t2,t3,t4);
		}
		else{
			int t2=read(),t3=read();
			write(ask(t2,t3)%mod);
			putchar('\n');
		}
	}
	return 0;
}

标签:记录,int,sum,Ynoi,sqrt,修改,add
From: https://www.cnblogs.com/ZnHF/p/18211682

相关文章

  • 记录Nginx开机自动启动(Windows环境)
    参考:Nginx配置及开机自启动(Windows环境)_nginx开机自启动windows-CSDN博客winsw下载地址Indexofreleases/com/sun/winsw/winsw或者参考Nginx安装、配置以及开机启动(Win10篇)_win10怎么查看nginx启动成功-CSDN博客......
  • 单片机HC32系列IO模拟I2C 延时调试记录
    一. SysTick_Config和delay冲突因为 SysTick_Config 被用于设置SysTick为操作系统计时,而 delay 函数又使用了SysTick来实现延时,导致两者对SysTick的配置不一致。导致 SysTick_Config无法再次进入SysTick_IRQHandler()函数。 解决方法:将delay改为for循环延时。delay1......
  • Java利用Aop切面记录操作日志(注解方式)
    前提需求之前收到一个新需求,要求对已有的系统上新增一个记录操作日志的功能,对于这类功能大家应该也看的很多了,必然是AOP进行解决,方便快捷,就是需要一个个方法加注释比较麻烦,说到AOP,就先粗略的介绍下AOPAOP的概念1.1什么是AOP?AOP(AspectOrientedProgramming):⾯向切⾯编程......
  • 深度学习吴恩达学习记录 141-150
    人脸验证问题:对于进行人脸验证我们在数据库中可能只有每位员工的一张照片而已,然而要通过这一张照片验证出是否是库中的员工,同时如果在库中增加成员是否能验证出来,这种数据集实在太小,可以使用learningasimilarityfunction这个函数进行计算验证,其作用就是设置一个阈值,如果说对人......
  • 如何监控员工聊天记录:平衡企业安全与员工隐私
    在当今数字化办公环境中,企业面临着前所未有的信息安全挑战。员工聊天记录作为企业信息安全的重要组成部分,其监控已成为保护商业机密、客户资料和知识产权的关键措施。然而,这一做法也引发了关于员工隐私权的广泛讨论。本文将探讨如何在保障企业安全的同时,尊重并保护员工的隐私权。......
  • Risc-V 移植 ssh 与 sftp 记录
    Risc-V移植ssh与sftp记录关于Risc-V  天下苦intel久矣,而ARM的授权费也不低,导致市面上的SOC要么都很贵,要么厂家和品类没那么丰富,全志、ST、TI、RK、晶晨、海思、高通、联发科。。。都是中大规模的公司,小厂做不了,感觉限制了它的发展。  后来出了个Risc-V指令......
  • 空调清洗记录
    昨天晚上清洗了以下空调,不是仅清洗过滤网。洗完发现,空调里的脏东西把空调出水口堵住了,导致出水口的水无法排出,就在出水口附近滴出来了,回家还要解决以下这个问题,看到网上说在空调出水管的最外面,对着吹一下关于空调清洗的几点体会:不锈钢片喷清洗剂时,要遵循少量的原则,清洗剂基本只......
  • Redis安装学习记录
    一、Redis介绍Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过RedisSentinel提供高可用......
  • MySQL 存储过程返回更新前记录
    在MySQL中,如果我们想在存储过程中返回更新前的记录,这通常不是直接支持的,因为UPDATE语句本身不返回更新前的数据。但是,我们可以通过一些策略来实现这个需求。1.MySQL存储过程返回更新前记录常用的方法策略以下是一个常见的策略:(1)使用临时表或表变量:在执行UPDATE之前,将需要更新的......
  • windows服务器 启用 TLS 1.0 ,1.1漏洞问题修复记录
     测试对象:windowsserver2016或2019IIS,sqlserver2014布署的网站启https证书绑定安全检查有漏洞 启用TLS1.0高危,1.1漏洞中危问题修复记录 IISCryptohttps://www.nartac.com/Products/IISCrypto/DownloadIISCrypto是一个免费工具,使管理员能够在WindowsServer......