备战蓝桥杯 Day4 差分

差分(修改区间后查询)

1.要点

复制代码
a[0]=0;
for(int i=1;i<=n;i++){
	diff[i]=a[i]-a[i-1];//构建差分数组
}
//原数组a区间[l,r]全部加上x
diff[l]+=x;//还原a数组[l,n]全部加上x
diff[r+1]-=x;//还原a数组[r+1,n]全部减去x
for(int i=1;i<=n;i++){
	a[i]=a[i-1]+diff[i];
}

实现多次修改完后多次查询 ,不能实现边修改边查询

2.例题

2022重新排序

利用差分+1-1获得数组每个位置的查询次数(可简化为一个数组),而查询次数*数字=总和 ,要排序只需原数组和查询次数数组均升序即可实现数字越大 ,查询次数越大,再利用查询次数*数字=总和,只不过第一次可以利用前缀和

复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N=1e5+9;
ll a[N],b[N],bdiff[N];//b[N]为位置查询次数数组.bdiff[N]为位置查询次数差分数组 
 
int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int m;
	cin>>m;
	ll res=0,sumA=0,sumB=0;
	while(m--){
		ll l,r;
		cin>>l>>r;
		bdiff[l]+=1;
		bdiff[r+1]-=1;
	}
	for(int i=1;i<=n;i++){
		b[i]=b[i-1]+bdiff[i];//b[i]为每个位置查询次数 
	}
	for(int i=1;i<=n;i++){
		sumA+=a[i]*b[i];//查询次数*数字=总和 
	}
	sort(a+1,a+1+n),sort(b+1,b+1+n);//两个数组均排序就能实现大数字在次数高位
	for(int i=1;i<=n;i++){
		sumB+=a[i]*b[i];
	} 
	res=sumB-sumA;
	cout<<res;
	return 0;
}

2018三体攻击

三维差分太困难,目前先不纠结,之后遇到太难的题目不要浪费时间,暴力拿分跳过,此题学习到:

1.三维数组不能开太大,否则编译不通过,可以第一维开3000,后两维开200

2.多层for中直接退出先输出答案然后exit(0),不用break

相关推荐
LuminousCPP9 小时前
从零开始学 C++(三):类和对象入门|从 struct 到 class,理解封装、对象与 this 指针
c++·笔记·学习·类和对象
郝学胜-神的一滴9 小时前
游戏引擎原理与实践 01:聊聊游戏引擎的前世今生
开发语言·c++·游戏引擎·产品运营·软件工程·产品经理·untiy
Allen_LVyingbo9 小时前
信息化部门在AI时代的编程转移路径分析(上)
人工智能·python·算法·健康医疗·数据库开发·时序数据库·数据库架构
七牛云行业应用9 小时前
Jev 报 401 / api_key_required 怎么解决:TypeSafe AI 官方错误码表与排查步骤
算法·github
晴天的雨.9929 小时前
【C++算法】三数之和
开发语言·c++·算法
pippocao10 小时前
王者荣耀日志组件BqLog 为何如此快之3——压缩日志执行路径优化
c++
AC赳赳老秦10 小时前
公开 CSV 数据集批量处理实战:用 OpenClaw 高效完成下载、清洗与标准化分析样本生成
java·开发语言·汇编·c++·python·deepseek·openclaw
凉茶钱10 小时前
【吃透C++】static、友元、内部类、匿名对象与拷贝编译器优化全解析
c++·青少年编程·visual studio
无名猿10 小时前
左值引用、右值引用与万能引用:引用折叠全解
c++·现代c++·模板元编程·语法基础
多多爱学习10 小时前
括号有几层?得看还有多少个左括号没闭合
c语言·c++·算法·面试