前缀和加法
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
const int N = 1e3+10;
int arr[N];
int pre[N];
int org[N];
int main(void)
{cin >> n;for(int i = 1 ; i <= n ; i++){cin >> arr[i];pre[i] = pre[i-1] + arr[i];}cout << "输出前缀和数组:"<<endl;for(int i = 0 ; i <= n ; i++)cout << pre[i] << " ";cout << endl; //输出下标1~2的区间和int l = 1,r = 2;cout << "输出下标1~2的区间和:" << pre[r]-pre[l-1]; cout << endl;//根据前缀和复原初始数组for(int i = 1 ; i <= n ; i++)org[i] = pre[i] - pre[i-1];cout << "输出原始数组:";for(int i = 1 ; i <= n ; i++)cout << org[i] << " "; return 0;
}
/*
11
8 5 3 2 1 5 6 9 4 3 2
*/
前缀积
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
const int N = 1e3+10;
int arr[N];
int pre[N];
int ori[N];
const int mod = 2;
int main(void)
{cin >> n;pre[0] = 1;//初始化为1 for(int i = 1 ; i <= n ; i++){cin >> arr[i];pre[i] = (pre[i-1] * arr[i]);//pre[i] = (pre[i-1] * arr[i])%mod}cout << "输出前缀积数组:"<<endl;for(int i = 0 ; i <= n ; i++)cout << pre[i] << " ";cout << endl; //输出下标1~2的区间和int l = 1,r = 2;cout << "输出下标1~2的区间积:" << pre[r]/pre[l-1]; //没有取模的情况可以直接使用 cout << endl; for(int i = 1 ; i <= n ; i++)ori[i] = pre[i]/pre[i-1];cout << "输出原始数组:";for(int i = 1 ; i <= n ; i++)cout << ori[i] << " ";return 0;
}
/*
11
8 5 3 2 1 5 6 9 4 3 2
*/
前缀异或
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
const int N = 1e3+10;
int arr[N];
int pre[N];
int ori[N];
int main(void)
{cin >> n;pre[0] = 0;//0为异或的恒等元 for(int i = 1 ; i <= n ; i++){cin >> arr[i];pre[i] = (pre[i-1] ^ arr[i]);}cout << "输出前缀异或数组:"<<endl;for(int i = 0 ; i <= n ; i++)cout << pre[i] << " ";cout << endl; //输出下标1~2的区间和int l = 1,r = 2;cout << "输出下标1~2的区间异或:" << (pre[r]^pre[l-1]);cout << endl; for(int i = 1 ; i <= n ; i++)ori[i] = pre[i]^pre[i-1];cout << "输出前缀异或数组:";for(int i = 1 ; i <= n ; i++)cout << ori[i] << " "; return 0;
}
/*
11
8 5 3 2 1 5 6 9 4 3 2
*/
后缀和:
一个数组包含了非负整数,要求从某个点开始,直到末尾和直到0的和。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
const int N = 1e3+10;
int arr[N];
int suffix[N];
int org[N];
int main(void)
{cin >> n;for(int i = 1 ; i <= n ; i++)cin >> arr[i];for(int i = n ; i >= 1 ; i--){if(arr[i]){suffix[i] = suffix[i+1];//先加上后一个后缀和 suffix[i] += arr[i]; //加入arr[i]的元素 }}for(int i = 1 ; i <= n ; i++)cout << suffix[i] << " ";return 0;
}
/*
8
1 2 0 3 4 1 0 5
正确答案
3 2 0 8 5 1 0 5
*/