【牛客挑战赛48 E】速度即转发

本文介绍了一种解决特定区间查询问题的有效算法——离线莫队算法,并通过一个具体题目来展示其实现过程。该算法适用于需要高效处理大量区间更新与查询的问题场景。

题目

题目链接:https://ac.nowcoder.com/acm/contest/11161/E
给定一个长度为 nnn 的数组 aaa。支持 mmm 次操作:

  • 给定 l,r,kl,r,kl,r,k,求 [0,105][0,10^5][0,105] 内满足 ∑i=lrmax⁡(ai−x,0)≥k\sum^{r}_{i=l}\max(a_i-x,0)\geq ki=lrmax(aix,0)k 的最大正整数 xxx
  • 给定 x,yx,yx,y,将 axa_xax 修改为 yyy

n,m,ai≤105,k≤1010n,m,a_i\leq 10^5,k\leq 10^{10}n,m,ai105,k1010

思路

设值域为 AAA
一个直观的想法是直接分块,对于每一个块维护 sum[x],cnt[x]sum[x],cnt[x]sum[x],cnt[x] 表示不小于 xxx 的数字之和以及出现次数,但是这样每次修改是 O(A)O(A)O(A) 的,无法接受。
那么自然会想到再对值域分块,然后每次询问从大到小枚举。但是这样每次询问的复杂度又是 O(nA)O(\sqrt{nA})O(nA) 的,依然不可以接受。
所以考虑离线下来用带修莫队维护。设 sum[x],cnt[x]sum[x],cnt[x]sum[x],cnt[x] 表示值域在 [xT,(x+1)T)[xT,(x+1)T)[xT,(x+1)T) 区间的数字和以及出现次数,指针移动的复杂度是 O(1)O(1)O(1) 的,询问的时候易容从大到小枚举块,如果这个块符合要求,那么再枚举这个块内的所有数字即可。这样一次询问就是 O(A)O(\sqrt{A})O(A) 的。复杂度就得以保证了。
时间复杂度为 O(n53+mA)O(n^{\frac{5}{3}}+m\sqrt{A})O(n35+mA)。我取序列块长为 200020002000,值域块长为 320320320

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;

const int N=100010,M1=2000,M2=320;
int n,m,sb,a[N],bel[N],X[N],Y[N],cnt[M2+1],res[N];
ll sum[M2+1],ans[N];

struct Query
{
	int l,r,k,t,id;
	
	friend bool operator <(Query x,Query y)
	{
		if (bel[x.l]!=bel[y.l]) return bel[x.l]<bel[y.l];
		if (bel[x.r]!=bel[y.r]) return bel[x.r]<bel[y.r];
		return x.t<y.t;
	}
}ask[N];

int read()
{
	int d=0; char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch)) d=(d<<3)+(d<<1)+ch-48,ch=getchar();
	return d;
}

void write(ll x)
{
	if (x>9) write(x/10);
	putchar(x%10+48);
}

void add(int x)
{
	sum[bel[a[x]]]+=a[x];
	cnt[bel[a[x]]]++;
	res[a[x]]++;
}

void del(int x)
{
	sum[bel[a[x]]]-=a[x];
	cnt[bel[a[x]]]--;
	res[a[x]]--;
}

signed main()
{
	n=read(); m=read();
	for (int i=1;i<=n;i++)
	{
		a[i]=read();
		bel[i]=(i-1)/M1+1;
	}
	for (int i=1,j=0,opt;i<=m;i++)
	{
		opt=read();
		if (opt==0) sb++,ask[sb]=(Query){read(),read(),read(),j,sb};
		if (opt==1) j++,X[j]=read(),Y[j]=read();
	}
	memset(ans,-1,sizeof(ans));
	sort(ask+1,ask+1+sb);
	for (int i=0;i<=100000;i++) bel[i]=i/M2;
	for (int o=1,l=1,r=0,j=0;o<=sb;o++)
	{
		int ql=ask[o].l,qr=ask[o].r,k=ask[o].k,t=ask[o].t;
		for (;l>ql;l--) add(l-1);
		for (;r<qr;r++) add(r+1);
		for (;l<ql;l++) del(l);
		for (;r>qr;r--) del(r);
		for (;j<t;j++)
		{
			if (l<=X[j+1] && r>=X[j+1]) del(X[j+1]); 
			swap(a[X[j+1]],Y[j+1]);
			if (l<=X[j+1] && r>=X[j+1]) add(X[j+1]);
		}
		for (;j>t;j--)
		{
			if (l<=X[j] && r>=X[j]) del(X[j]);
			swap(a[X[j]],Y[j]);
			if (l<=X[j] && r>=X[j]) add(X[j]);
		}
		ll s=0,c=0;
		for (int i=M2;i>=0;i--)
		{
			if (i*M2>=100000) continue;
			s+=sum[i]; c+=cnt[i];
			if (s-c*i*M2>=k)
			{
				for (int j=i*M2;j<min(100001LL,(i+1)*M2);j++)
				{
					if (s-j*c<k) { ans[ask[o].id]=j-1; break; }
					s-=res[j]*j; c-=res[j];
				}
				if (ans[ask[o].id]==-1) ans[ask[o].id]=min(100001LL,(i+1)*M2)-1;
				break;
			}
		}
	} 
	for (int i=1;i<=sb;i++)
		if (ans[i]!=-1) write(ans[i]),putchar(10);
			else putchar('-'),putchar(49),putchar(10);
	return 0;
}
AI 代码审查Review工具 是一个旨在自动化代码审查流程的工具。它通过集成版本控制系统(如 GitHub 和 GitLab)的 Webhook,利用大型语言模型(LLM)对代码变更进行分析,并将审查意见反馈到相应的 Pull Request 或 Merge Request 中。此外,它还支持将审查结果通知到企业微信等通讯工具。 一个基于 LLM 的自动化代码审查助手。通过 GitHub/GitLab Webhook 监听 PR/MR 变更,调用 AI 分析代码,并将审查意见自动评论到 PR/MR,同时支持多种通知渠道。 主要功能 多平台支持: 集成 GitHub 和 GitLab Webhook,监听 Pull Request / Merge Request 事件。 智能审查模式: 详细审查 (/github_webhook, /gitlab_webhook): AI 对每个变更文件进行分析,旨在找出具体问题。审查意见会以结构化的形式(例如,定位到特定代码行、问题分类、严重程度、分析和建议)逐条评论到 PR/MR。AI 模型会输出 JSON 格式的分析结果,系统再将其转换为多条独立的评论。 通用审查 (/github_webhook_general, /gitlab_webhook_general): AI 对每个变更文件进行整体性分析,并为每个文件生成一个 Markdown 格式的总结性评论。 自动化流程: 自动将 AI 审查意见(详细模式下为多条,通用模式下为每个文件一条)发布到 PR/MR。 在所有文件审查完毕后,自动在 PR/MR 中发布一条总结性评论。 即便 AI 未发现任何值得报告的问题,也会发布相应的友好提示和总结评论。 异步处理审查任务,快速响应 Webhook。 通过 Redis 防止对同一 Commit 的重复审查。 灵活配置: 通过环境变量设置基
【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器的状态空间平均模型的建模策略。该方法通过数学建模手段对直流微电网系统进行精确的状态空间描述,并对其进行线性化处理,以便于系统稳定性分析与控制器设计。文中结合Matlab代码实现,展示了建模与仿真过程,有助于研究人员理解和复现相关技术,推动直流微电网系统的动态性能研究与工程应用。; 适合人群:具备电力电子、电力系统或自动化等相关背景,熟悉Matlab/Simulink仿真工具,从事新能源、微电网或智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网的动态建模方法;②学习DC-DC变换器在耦合条件下的状态空间平均建模技巧;③实现系统的线性化分析并支持后续控制器设计(如电压稳定控制、功率分配等);④为科研论文撰写、项目仿真验证提供技术支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐步实践建模流程,重点关注状态变量选取、平均化处理和线性化推导过程,同时可扩展应用于更复杂的直流微电网拓扑结构中,提升系统分析与设计能力。
内容概要:本文介绍了基于物PINN驱动的三维声波波动方程求解(Matlab代码实现)理信息神经网络(PINN)求解三维声波波动方程的Matlab代码实现方法,展示了如何利用PINN技术在无需大量标注数据的情况下,结合物理定律约束进行偏微分方程的数值求解。该方法将神经网络与物理方程深度融合,适用于复杂波动问题的建模与仿真,并提供了完整的Matlab实现方案,便于科研人员理解和复现。此外,文档还列举了多个相关科研方向和技术服务内容,涵盖智能优化算法、机器学习、信号处理、电力系统等多个领域,突出其在科研仿真中的广泛应用价值。; 适合人群:具备一定数学建模基础和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事计算物理、声学仿真、偏微分方程数值解等相关领域的研究人员; 使用场景及目标:①学习并掌握PINN在求解三维声波波动方程中的应用原理与实现方式;②拓展至其他物理系统的建模与仿真,如电磁场、热传导、流体力学等问题;③为科研项目提供可复用的代码框架和技术支持参考; 阅读建议:建议读者结合文中提供的网盘资源下载完整代码,按照目录顺序逐步学习,重点关注PINN网络结构设计、损失函数构建及物理边界条件的嵌入方法,同时可借鉴其他案例提升综合仿真能力。
### 关于牛客网练习赛14 B题的解析 目前未找到直接针对牛客网练习赛14 B题的具体题解或比赛经验。然而,可以通过分析类似的题目以及常见的算法竞赛技巧来推测可能的解决方案。 #### 类似问题的解决思路 在算法竞赛中,B类题目通常涉及基础数据结构的应用或者简单的数学推导。以下是几种常见类型的处理方式: 1. **字符串操作** 若该题涉及到字符串处理,则可以利用C++中的`std::string`库函数[^2],例如查找子串、替换字符等操作。 2. **数组与序列** 对于数组或序列的操作,动态规划(Dynamic Programming, DP)是一种常用方法。通过定义状态转移方程,逐步解决问题。例如,在某些情况下,可以用滚动数组优化空间复杂度[^3]。 3. **图论模型** 如果题目描述中有提到节点之间的关系,可能是图论问题。此时可采用广度优先搜索(BFS)、深度优先搜索(DFS),甚至最短路径算法如Dijkstra或Floyd-Warshall来建模并求解[^1]。 4. **模拟与暴力枚举** 当面对简单逻辑判断或多步运算时,“模拟”成为一种有效手段。即按照题目给定规则一步步实现程序流程,虽然时间效率未必最优,但对于小规模输入非常适用[^5]。 下面提供一段伪代码框架供参考: ```cpp #include <iostream> using namespace std; int main(){ int testCase; cin >> testCase; while(testCase--){ // 输入处理... // 解决方案核心部分 // 输出结果 } } ``` #### 提升竞赛表现的经验分享 为了更好地准备此类赛事,建议采取以下策略: - 定期参与线上平台举办的各类比赛积累实战经历; - 复盘每次赛后官方发布的详解文档学习新知; - 加强基础知识巩固的同时拓宽思维边界尝试不同领域挑战项目; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值