A40832. 数组操作
填空题
困难
知识点
题目描述
数组操作
题目描述
给出一个长度为 n 的数组 {A},由 1 到 n 标号 , 你需要维护 m 个操作。
操作分为三种,输入格式为:
1 L R d,将数组中下标 L 到 R 的位置都加上 d,即对于 L<=i<=R,执行A[i]=A[i]+d。
2 L1 R1 L2 R2,将数组中下标为 L1 到 R1 的位置,赋值成 L2 到 R2 的值,保证 R1-L1=R2-L2。
换句话说先对 0<=i<=R2-L2 执行 B[i]=A[L2+i],再对 0<=i<=R1-L1 执行 A[L1+i]=B[i],其中 {B} 为一个临时数组。
3 L R,求数组中下标 L 到 R 的位置的和,即求出 $∑_(i=L到R) A_i $。
输入格式
从标准输入读入数据。
第一行一个整数 Case,表示测试点编号,其中 Case=0 表示该点为样例。
第二行包含两个整数 n,m。保证 \(1<=n,m<=10^5\)。
第三行包含 n 个整数 \(A_i\),表示这个数组的初值。保证 \(0<=A_i<=10^5\)。
接下来 m 每行描述一个操作,格式如问题描述所示。
对于操作中提到每个数,满足 0<=d<=10^5,1<=L<=R<=n,1<=L1<=R1<=n,1<=L2<=R2<=n,R1-L1=R2-L2。
输出格式
输出到标准输出。
对于每次 3 操作输出一行一个数,表示求和的结果。
样例输入
0
5 6
1 2 3 4 5
2 1 3 3 5
3 3 5
1 2 4 2
3 3 5
2 1 3 3 5
3 1 5
样例输出
14
18
29
参考答案
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
class Solution{
public:
vector<int> nums;
vector<ull> ans;
int N, M;
void func1(int, int, int);
void func2(int, int, int, int);
void func3(int, int);
void show();
void solve();
};
void Solution::show() {
for (int i=0; i<N; i++) {
cout<<nums[i]<<" ";
}
cout<<endl;
}
// 对应数组操作一
void Solution::func1(int begin, int end, int num) {
for (int i=begin; i<end; i++) {
nums[i] += num;
}
}
// 对应数组操作二
void Solution::func2(int num1, int num2, int begin, int end) {
vector<int> tmp;
for (int i=begin; i<end; i++) {
tmp.push_back(nums[i]);
}
for (int i=num1; i<num2; i++) {
nums[i] = tmp[i-num1];
}
tmp.clear();
}
// 对应数组操作三
void Solution::func3(int begin, int end) {
ull sum = 0;
for (int i=begin; i<end; i++) {
sum += nums[i];
}
cout<<sum<<endl;
//ans.push_back(sum);
}
// 解决函数
void Solution::solve() {
int flag = 0;
int num1, num2;
int begin, end, num;
cin>>flag;
cin>>N>>M;
nums.resize(N);
for (int i=0; i<N; i++) {
cin>>nums[i];
}
for (int i=0; i<M; i++) {
cin>>flag;
switch (flag) {
case 0:break;
case 1:
cin>>begin>>end>>num;
func1(begin-1, end, num);
//show();
break;
case 2:
cin>>num1>>num2>>begin>>end;
func2(num1-1, num2, begin-1, end);
//show();
break;
case 3:
cin>>begin>>end;
func3(begin-1, end);
//show();
break;
}
}
}
int main(void) {
Solution su;
su.solve();
return 0;
}
上一题
下一题