3.蓝桥速算【算法赛】 - 蓝桥云课
问题描述
蓝桥杯大赛最近新增了一项娱乐比赛——口算大赛,目的是测试选手的口算能力。
比赛规则如下:
- 初始给定一个长度为 N 的数组 A,其中第 i 个数字为 Ai。
- 随后数组会被隐藏,并进行 Q 次值域变换操作。
- 每次操作给出两个数字 L,R (1≤L≤R≤N),表示对子数组 [L,R] 进行如下变换:
- AL 增加 L。
- AL+1 减少 L+1。
- AL+2 增加 L+2。
- AL+3 减少 L+3。
- 以此类推,直到 R。
在所有操作完成后,选手需要快速计算出最终的数组之和,最快回答出正确答案的选手将会获得奖励,请你尝试解决这个问题。
输入格式
第一行输入两个整数 N,Q (1≤N,Q≤105) 表示数组长度和值域变换操作次数。
第二行输入 N 个整数 A1,A2,A3,…,AN (1≤Ai≤105) 表示数组的初始值。
接下来 Q 行,每行两个整数 L,R (1≤L≤R≤N) 表示一次值域变换操作。
输出格式
输出一个整数,表示值域变换操作完毕后数组之和。
输入样例
5 2
1 2 3 4 5
1 3
4 5
输出样例
16
思路:
暴力
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll L = 1e5+10;
ll N,Q;
ll a[L];
int main(void)
{cin >> N >> Q;for(ll i = 1 ; i <= N ; i++)cin >> a[i];while(Q--){ll l,r,cnt = 1;cin >> l >> r;for(ll i = l ; i <= r ; i++){if(cnt % 2 != 0){cnt++;a[i] += i;}else if(cnt % 2 == 0){cnt++;a[i] -= i;}}}ll sum = 0;for(ll i = 1 ; i <= N ; i++)sum += a[i];cout << sum;return 0;
}
思路:
数学问题,注释写的清楚
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll L = 1e5+10;
ll N,Q;
ll a[L];
int main(void)
{ll sum = 0;cin >> N >> Q;for(ll i = 1 ; i <= N ; i++){cin >> a[i];sum += a[i];}while(Q--){ll l,r,cnt = 1;cin >> l >> r;ll s = r-l+1;if(s % 2 == 0)//长度为偶数,会出现s/2个-1 {sum -= s/2; }else if(s % 2 != 0)//长度为奇数,会出现(1+s/2)个1 {sum += (l + s/2);}}cout << sum;return 0;
}