P3203

一种更简单的想法,只用用分块思想(或者根号分治?)不用分块。

先考虑暴力怎么做:修改直接改,查询不停跳下一个点。但这样会被卡到 O(n2)

考虑分块思想优化:如果保证每次至少跳 n 的距离,总复杂度就会降到 O(nn)

于是可以维护每个点开始至少跳 n 的距离要跳多少次,会跳多远。

但是发现这样修改的时候,在它前面的所有点都会被影响,复杂度炸了。所以换作维护从一个点开始到点 x,使得从这里再跳一次就至少跳了 n 的距离。这样就只用重构被修改的点之前的 n 个点了。

总复杂度 O(nn)

只放核心代码。

code:

点击查看代码
inline void pushup(int x){
	c[x]=1;
	f[x]=e[x];
	while(x+f[x]<=n&&f[x]+f[x+f[x]]<len){
		c[x]+=c[x+f[x]];
		f[x]+=f[x+f[x]];
	}
}
int query(int x){
	int ret=0;
	while(x<=n){
		ret+=c[x];
		x+=f[x];
	}
	return ret;
}
void update(int x,int y){
	e[x]=y;
	pushup(x);
	for(int i=x-1;i>=max(1,x-len);i--){
		pushup(i);
	}
}

温馨提醒:重构和初始化一定要从后往前。

posted @   yinhee  阅读(18)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示