首页 > 子段和
头像 憨憨的竹林
发表于 2026-03-03 00:29:54
什么时候会输出NO?其实观察题目样例我们能很轻松得到答案来着如果序列内有0,那么一定有长度为1的子段和(即元素它自己)是0,直接ban掉另外一种情况,如果序列里只有一个数和他的相反数,那么无论如何排列,都始终无法排序成功使得没有长度2的子段和为0证明的话可以这样想:假设序列里面有m个a和n个-a,那 展开全文
头像 kilomatutinal
发表于 2026-03-03 09:27:16
这道题其实挺简单的喵!注意长度小于等于 2 的子区间和不等于 0喵!我们就可以知道相反数不能相邻喵!这就非常简单了喵!假如数组里有0的话,一定NO喵!因为相同的数分散开是不利于满足题意的!所以我们可以把相同数放在一起,看作一个数喵!其实就是去重喵!假设去重后数字大于2的话,就一定是YES!因为有多组 展开全文
头像 AliLexiWalker
发表于 2026-03-03 23:45:30
大概思路就是,随便选一个数看是否存在相反数,并且两者数量加和是否为n就可以判断是否存在所需数组 #include<bits/stdc++.h> using namespace std; using ll=long long; using ull=unsigned long long; 展开全文
头像 Guoxu_
发表于 2024-02-21 16:58:38
思路 不满足条件的情况 存在元素为0。 不存在元素为0。这样思考,首先将数组排列,假设数组元素正负交汇处的正数和负数分别为,,而 + 是唯一能等于0的情况,如果此时存在一个元素,则可以将其插入,之间使数组满足条件。综上所述,如果数组只包含两个互为相反数的元素,则不满足条件。 代码实现 #i 展开全文
头像 此在Dasein
发表于 2026-03-03 05:46:16
1. 问题分析 问题的核心是在给定序列的重排中,消除两类“零和”子区间: 长度为 1 的子区间:即序列中的单个元素 。若 ,则该区间和必为 0。 长度为 2 的子区间:即相邻的两个元素 。若 ,即两者互为相反数,则该区间和为 0。 由于 的规模达到 ,我们需要一个 或 的算法。 2. 构造 展开全文
头像 尖刀笑不停
发表于 2026-03-03 09:01:41
n=int(input()) a=list(set(map(int,input().split()))) if 0 in a: print("NO") else: if len(a)==2 and a[0]+a[-1]==0: print(&qu 展开全文
头像 pandaC222
发表于 2026-03-03 13:24:11
试着想一下不难发现只有两种情况会NO,一种是本身就含有0,另一种是这个序列全是某个数和其相反数,紧接着我们写出代码 #include <iostream> #include<bits/stdc++.h> #include <vector> using namesp 展开全文
头像 是个NULL
发表于 2026-03-03 19:56:39
注意到长度最小为2的子序列和不为01,特判数组中出现0的情况2,为了不出现相邻和为0,我们可以取巧 把负数都放左边,正数都放右边,此时我们只需要考虑正负数交界处即可,此时我们发现只要数组中各元素的绝对值之和不同即可(PS:当然要排除都是正数和负数的情况)。
头像 牛客442681056号
发表于 2026-03-07 00:08:19
首先我们观察到存在 a[i] == 0 时,一定输出 "NO" 排除掉 a[i] == 0 的情况后,我们可以发现,a[i] 不是正就是负 我于是定性地画出了 “图像” 我们可以把正数分一个组,负数分一个组 可以想到没有正数或是没有负数时,不可能 存在和为 0 的情况 之后就是判断 交界处两个数加 展开全文
头像 如歌丶
发表于 2022-03-28 14:57:18
给定一个序列,问你有没有可能重新排列这个序列使得所有长度小于等于 22 的子区间和不等于 00。 using namespace std; #include <string> long long a[500000]; long long minn,maxn; int main() { 展开全文