测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题