ToB企服应用市场:ToB评测及商务社交产业平台

标题: 备战蓝桥杯 Day4 差分 [打印本页]

作者: 科技颠覆者    时间: 2025-2-20 00:07
标题: 备战蓝桥杯 Day4 差分
差分(修改区间后查询)

1.要点

  1. a[0]=0;
  2. for(int i=1;i<=n;i++){
  3.         diff[i]=a[i]-a[i-1];//构建差分数组
  4. }
  5. //原数组a区间[l,r]全部加上x
  6. diff[l]+=x;//还原a数组[l,n]全部加上x
  7. diff[r+1]-=x;//还原a数组[r+1,n]全部减去x
  8. for(int i=1;i<=n;i++){
  9.         a[i]=a[i-1]+diff[i];
  10. }
复制代码
实现多次修改完后多次查询,不能实现边修改边查询
2.例题

2022重新排序

利用差分+1-1获得数组每个位置的查询次数(可简化为一个数组),而查询次数*数字=总和,要排序只需原数组和查询次数数组均升序即可实现数字越大,查询次数越大,再利用查询次数*数字=总和,只不过第一次可以利用前缀和
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=1e5+9;
  5. ll a[N],b[N],bdiff[N];//b[N]为位置查询次数数组.bdiff[N]为位置查询次数差分数组
  6. int main(){
  7.         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
  8.         int n;
  9.         cin>>n;
  10.         for(int i=1;i<=n;i++){
  11.                 cin>>a[i];
  12.         }
  13.         int m;
  14.         cin>>m;
  15.         ll res=0,sumA=0,sumB=0;
  16.         while(m--){
  17.                 ll l,r;
  18.                 cin>>l>>r;
  19.                 bdiff[l]+=1;
  20.                 bdiff[r+1]-=1;
  21.         }
  22.         for(int i=1;i<=n;i++){
  23.                 b[i]=b[i-1]+bdiff[i];//b[i]为每个位置查询次数
  24.         }
  25.         for(int i=1;i<=n;i++){
  26.                 sumA+=a[i]*b[i];//查询次数*数字=总和
  27.         }
  28.         sort(a+1,a+1+n),sort(b+1,b+1+n);//两个数组均排序就能实现大数字在次数高位
  29.         for(int i=1;i<=n;i++){
  30.                 sumB+=a[i]*b[i];
  31.         }
  32.         res=sumB-sumA;
  33.         cout<<res;
  34.         return 0;
  35. }
复制代码
2018三体攻击

三维差分太困难,现在先不纠结,之后遇到太难的题目不要浪费时间,暴力拿分跳过,此题学习到:
1.三维数组不能开太大,否则编译不通过,可以第一维开3000,后两维开200
2.多层for中直接退出先输出答案然后exit(0),不消break

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4