前缀和
求 1 2 3 4 5 几个元素之间任意一区间的和
求出前缀和:1 3 6 10 15
求第二个到第四个区间和=10-1=9
求第三个到第五个区间和=15-3=12
发现规律:求第i个到第j个区间和=前缀和数列[ j ]-前缀和数列[ i-1 ]
题目传送门:【深进1.例1】求区间和 - 洛谷
AC代码:
#include<iostream>
using namespace std;
int shuzu[100001],a,last,k,t,x,y;
int main(){
//前缀和程序(100分)
cin>>a;
for(int i=1;i<=a;i++){
cin>>k;
shuzu[i]=last+k;
last=shuzu[i];
}
cin>>t;
for(int i=1;i<=t;i++){
cin>>x>>y;
cout<<shuzu[y]-shuzu[x-1]<<endl;
}
return 0;
}
二维前缀和思想及其递推式:(2024/5/12凌晨补充)
其中s【】为 前缀和数组,shu[]为输出的数据存放数组
s [ i- 1] [ j ] + s [ i ] [ j - 1 ] - (重复的) s [ i - 1 ] [ j - 1 ] + s h u [ i ] [ j ] = s [ i ] [ j ]
差分
例题:语文成绩 - 洛谷
步骤三步走:第一 求出差分数组
例如 1 1 1对应的差分数组是 1(第一位落下来) 0(1-1) 0(1-1)
第二 读取区间修改 起始位置 以及 修改数据
例如 区间1~2 每个增加1
差分数组 的 第下标为1的 就增加1 ,下标为2+1的减少1
得到差分数组 2 0 -1
区间2~3 每个增加1
差分数组 的 第 下标为2的 就增加1 ,下标为 3+1的就减少1(越界,不计)
得到差分数组 2 1 -1
最后将最后的差分数组计算前缀和
得到答案:2 3 2(最小是2,输出2)
AC代码:
#include<iostream>
using namespace std;
int shuzu[5000001],chafen[5000001];
int main(){
int n,p;int a,b,x;
cin>>n>>p;
for(int i=1;i<=n;i++)cin>>shuzu[i];
for(int i=1;i<=n;i++){
chafen[i]=shuzu[i]-shuzu[i-1];
}
for(int i=1;i<=p;i++){
cin>>a>>b>>x;
chafen[a]+=x;
chafen[b+1]-=x;
}
int minn;
for(int i=1;i<=n;i++){
chafen[i]=chafen[i-1]+chafen[i];
if(i==1)minn=chafen[i];
else minn=min(chafen[i],minn);
}
cout<<minn;
}
建议不用sort进行排序(TLE。。)