当前位置: 首页 > article >正文

备战蓝桥杯 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


http://www.kler.cn/a/552286.html

相关文章:

  • 学习机器视觉halcon3D需要什么基础知识
  • 【工具类】 Hutool 中用于生成随机数的工具类
  • 【USRP】N210,X310,X410 如何优雅得接入 Vmware 虚拟机
  • Vue学习记录19
  • CPP集群聊天服务器开发实践(六):Redis发布订阅消息队列及服务器集群通信
  • JAVA过滤器(学习自用)
  • Vue.js 框架
  • 基于TCP与UDP协议的性能测试研究
  • 【AI】Pytorch基础与张量计算入门
  • C++ queue:数据结构的“排队哲学”与“先进先出法则
  • python爬虫系列课程3:解决爬虫过程中遇到的编码问题
  • Excel如何实现行分级,以及如何用Python 3实现Excel行分级
  • C++(23):unreachable
  • 深入解析 Flutter 高级路由管理:使用 go_router 和 auto_route 实现复杂路由与拦截
  • Mermaid绘图技巧:如何在节点文本中实现换行
  • 力扣 跳跃游戏 II
  • 从WebRTC到EasyRTC:嵌入式适配的视频通话SDK实现低延迟、高稳定性音视频通信
  • springboot024-玩具租赁系统
  • Java-数据结构-(HashMap HashSet)
  • 阶段 1:Kafka基础认知