CodeForces..奇数查询.[简单].[数组计算].[n项和]

题目描述:


题目解读:

给定数组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;
}

遇到的错误:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值