题目描述:
题目解读:
给定数组an,将数组内第l位到第r位的元素变为k,问数组元素和会变为奇数吗?
第一行输入数组长度n和查询(改写)次数q
第二行输入数组所有元素
接下来q行输入 l,r,k,分别代表被更改元素的左右边界和要修改成的值k
输出数组元素和是否为奇数,是则yes 不是则no
解题思路:
循环替换的话下一轮没法回归原值。所以要计算未修改的元素的和,再加上被修改元素的和k*(r-l+1),对总和判断奇偶。
思路一:先输入数组后,循环计算a[1]~a[l-1]的和,a[r]~a[n]的和,l-r+1个k的和,三部分相加,然后判断奇偶。(该思路可行,但是oj判定超时)
思路二:输入数组的同时,计算前n项和,比如a[2]=a1+a2,a[3]=a1+a2+a3...最后将a[l-1],a[n]-a[r],(l-r+1)*k,三部分相加,判断奇偶即可。
代码实现:
思路一:
#include <stdio.h>
#define MAX 200000 void Solve() {int n,q,l,r,k; int i = 0;int num[MAX];int sum = 0;scanf("%d%d", &n,&q);num[0] = 0;for (i = 1; i <= n; i++) {scanf("%d", &num[i]);}while (q--) {scanf("%d%d%d", &l, &r, &k);for (i = 1; i < l; i++) {sum += num[i];}for (i = r + 1; i <= n; i++) {sum += num[i];}sum += k * (r - l + 1);if (sum % 2 == 0) {printf("NO\n");}else {printf("YES\n");}sum = 0;}return;
}int main() {int t;scanf("%d", &t);while (t--) Solve();return 0;
}
思路二:
#include <stdio.h>void Solve() {int n, q;scanf("%d%d", &n, &q);int num[n];num[0] = 0;for (int i = 1; i <= n; i++) {int nums;scanf("%d", &nums);num[i] =num[i-1]+ nums; }for (int j = 0; j < q; j++) {int l, r, k;scanf("%d%d%d", &l, &r, &k);int sum=(num[l-1]-num[0]) + (num[n] - num[r]) + k * (r - l + 1);if (sum % 2 == 0) {printf("NO\n");}else printf("YES\n");}return;
}int main() {int t;scanf("%d", &t);while (t--) Solve();return 0;
}
遇到的错误: