首页 > 其他分享 >D Odd Queries 题解

D Odd Queries 题解

时间:2023-06-25 22:12:55浏览次数:43  
标签:puts int 题解 奇偶性 修改 数组 Queries Odd 总和

原题传送门

题意简述

给定一个数组,再给出 m 个各自独立(即这个操作不影响后续的询问)的询问,每次给定一个区间,询问将这个区间每个元素都修改为k后,数组总和会是奇数吗?

解决思路

由于n的范围很大,所以暴力肯定是不可以了,由于每个询问是独立的,我们不需要修改序列,所以不需要使用数据结构。

我们思考后可以发现,其实可以 判断修改后的总和 与 原来这个区间的总和 奇偶性的异同,如果相同其实修改后整个数组的奇偶性是不变的,不同才会发生改变。

讲了那么多,肯定有小伙伴已经懵了,别急,举个例子就懂啦。

例如下面这个数组:

a[5] = {1, 2, 3, 4, 5} 显然,总和为15

------------------------------------分割线qwq

选择区间1 ~ 3 修改为 3

此时修改后的总和: (r - l + 1) * k = (3 - 1 + 1) * 3 = 9
原来的总和: a[1] + a[2] + a[3] = 1 + 2 + 3 = 6
修改后的数组:a[5] = {3, 3, 3, 4, 5} 显然,总和为18

发现了吗,修改后的总和9与原来的总和6奇偶性不同,所以修改后的数组总和奇偶性也与原来不同

------------------------------------又是分割线qwq

选择区间1 ~ 3 修改为 4

此时修改后的总和: (r - l + 1) * k = (3 - 1 + 1) * 4 = 12
原来的总和: a[1] + a[2] + a[3] = 1 + 2 + 3 = 6
修改后的数组:a[5] = {4, 4, 4, 4, 5} 显然,总和为21

发现了吗,修改后的总和12与原来的总和6奇偶性相同,所以修改后的数组总和奇偶性也与原来相同

那有了思路,该如何写代码呢?

其实代码里最难的就是如何在O (n) 的时间复杂度内求出某个数组的和,由于 n 很大,所以不能暴力。

这就要运用到一种新奇的算法 -- 前缀和,关于前缀和在此不进行介绍,需要点这学习

那代码其实就很简单了,但是要注意下,问题问的是数组总和是否是奇数,所以要特判下。

code:

#include <iostream>
#include <cstring>

#define int long long

const int N = 200010;

using namespace std;

int t;

int s[N];

void solve()

{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ ) 
	{
		int x;
		cin >> x;
		s[i] = s[i - 1] + x;//前缀和
	}
    bool f = true;
	if (s[n] % 2) f = false;//数组总和奇偶性,false表示奇数,true表示偶数
	while (m -- )
	{
		int l, r, k, sum;
		cin >> l >> r >> k;
		sum = (r - l + 1) * k;//修改后的区间和
		int fir = (sum % 2), second = (s[r] - s[l - 1]) % 2;//两个总和的奇偶性
		if (!f)
		{
			if (fir == second) puts("YES");
			else puts("NO");
		}
		else
		{
			if (fir == second) puts("NO");
			else puts("YES");
		}
	}
}

signed main()

{
	cin >> t;
	while (t -- ) solve();
}

标签:puts,int,题解,奇偶性,修改,数组,Queries,Odd,总和
From: https://www.cnblogs.com/User90174/p/17504110.html

相关文章

  • 01 矩阵题解
    DescirptionSolution若定义\(f(k)\)为一行有\(k\)个\(1\)的方案数,则\(\displaystylef(k)=\binom{m}{k}x^ky^{m-k}\)。则\(\displaystyleE=\sum_{i=0}^{m}i\sum_{j=1}^{n}\binom{n}{j}f(i)^j\left(\sum_{k=i+1}^{m}f(k)\right)^{n-j}\)。不妨设\(\display......
  • CF321C Ciel the Commander 题解 点分治
    题目链接:http://codeforces.com/problemset/problem/321/C解题思路:点分治模板题。每次找到重心给他分配一个字符,分治往下走的时候分配的字符ASCII码\(+1\)即可。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;vector<int>g[maxn];i......
  • 洛谷P4178 Tree 题解 树上点分治
    题目链接:https://www.luogu.com.cn/problem/P4178解题思路:点分治模板题。设当前重心为\(u\),一共有三种不同类型的路径:路径的一个端点恰好是重心\(u\);路径的两个端点在\(u\)的不同子树中;路径的两个端点在\(u\)的同一个子树中。找到重心\(u\)之后,前两类路径分开求......
  • 基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案
    前些时候有给大家分享一篇uni-app+vite4+uview-plus搭建跨端项目。今天主要分享下在uniapp中渲染markdown语法及uniapp中软键盘弹起,页面tabbar或顶部自定义navbar导航栏被撑起挤压的问题。如上图:支持h5+小程序+App端markdown解析渲染。上面则是演示了在App端+小程序端键盘弹......
  • LOJ#6077. 「2017 山东一轮集训 Day7」逆序对题解
    考虑朴素dp,令\(f_{i,j}\)为\(1\simi\)排列有\(j\)个逆序对的排列数。有转移方程:\[f_{i,j}=\sum_{k=0}^{i-1}f_{i-1,j-k}\]特殊地,我们定义\(j<0\)的\(f_{i,j}\)为\(0\)。定义\(\displaystyleF_i(x)=\sum_{j=0}^{\infty}f_{i,j}x^j\),有\(\displaystyleF_{i}(x)=......
  • AGC021E Ball Eat Chameleons 题解
    本文网址:https://www.cnblogs.com/zsc985246/p/17501300.html,转载请注明出处。传送门AGC021EBallEatChameleons题目翻译有\(n\)只变色龙,一开始都是蓝色。你会依次扔出\(k\)个球,每次扔出都要指定一只变色龙吃掉这个球。扔出的球可以是红色或蓝色。变色龙从蓝色变成红......
  • 【Debian】更换阿里源出现的Certificate问题解决方法
    系统版本Debian11源配置debhttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdeb-srchttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdebhttps://mirrors.aliyun.com/debian-security/bullseye-securitymaindeb-src......
  • [ABC259F] Select Edges 题解
    Solution考虑树形\(dp\)。我们可以注意到节点\(i\)的相邻的边中被选中的不超过\(d_i\)条,显然我们可以定义状态\(dp_{u,k}\)表示节点\(u\)连接子节点的边有\(k\)条的最大值。但是此处没有给定\(d_i\)的范围,所以对于一个节点最多可能会有\(n-1\)个点,所以时间复杂......
  • 牛客题解-mixup2混乱的奶牛(状压dp)
    题解-mixup2混乱的奶牛[原题连接](1026-mixup2混乱的奶牛_2021秋季算法入门班第八章习题:动态规划2(nowcoder.com))题目描述混乱的奶牛[DonPiele,2007]FarmerJohn的N(4<=N<=16)头奶牛中的每一头都有一个唯一的编号S_i(1<=S_i<=25,000).奶牛为她们的编号感到骄傲......
  • P4920 题解
    前言题目传送门!更好的阅读体验?没看题解把未来程序切了,很高兴,来写篇题解!这篇题解在博客园里观看,效果明显更佳,请前往博客园。Program1简单的。显然答案为\((a\timesb)\bmodc\),转成__int128后暴力乘即可。代码有手就行。Program2简单的。给定\(n\)与\(mod\),有递推......