子段和–(牛客)
https://ac.nowcoder.com/acm/problem/232994
给定一个序列,问你有没有可能重新排列这个序列使得所有长度小于等于 2 的子区间和不等于0。
思路:
- 既然是长度小于等于2的子区间,那么首先需要判断序列里面有没有0,如果有的话就一定是NO
- 根据样例2可以知道,然后这个序列只有两种数,并且互为相反数那么就只能输出NO了
- 如果仅仅只有两个数互为相反数,并且n>2,那么就可以给它隔开
- 那么就是先进行排序,这样一来正数和负数就分开了,如果这个时候仅仅判断a[i]+a[i-1]==0是不行的,假设为-9 -2 2 4,这是排序好的,它是可以进行隔开的,所有需要进行更改,那就是2的情况了
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxLine = 5e5;
int a[maxLine],b[maxLine],c[maxLine];
void solve(){
int n;
cin>>n;
int ans=0;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]==0){//判断里面有没有0
cout<<"NO";
return ;
}
}
sort(a,a+n);//从小到大排序
for(int i=0;i<n;i++){
if(i==0||a[i]!=a[i-1]){//判断序列里面有几种数字
ans++;
}
}
if(ans==2&&a[0]+a[n-1]==0){//如果只有两种,并且互为相反数那就输出NO
cout<<"NO";
}
else{
cout<<"YES";
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int T=1;
//cin>>T;
while(T--){
solve();
}
return 0;
}