Codeforces Round 918 (Div. 4)
E. Romantic Glasses
题目链接
题意:
给定n和n个数的数组a,选取一段区间 [ l , r ] [l,r] [l,r],使得奇数位置上的数之和与偶数位置上的数之和一样,问能否找到这样一对lr
思路:
朴素想法是l和r分别预处理前缀和,然后枚举lr,不过 O ( n 2 ) O(n^2) O(n2)会超时。发现我们只需奇偶位置上的数一样大就行了,也就是奇数位置减偶数位置上的数为0就行了,那么我们搞个不一样的前缀和,奇数位置上加,偶数位置上减,这样就可以把两个前缀和数组变成一个,要找区间和为0的lr,只需要对每个r的前缀和,找一下前面有没有相同的前缀和就行了,用set查找就是 l o g n logn logn的,可以过。
code:
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
typedef long long ll;
int T,n;
int main(){
cin>>T;
while(T--){
cin>>n;
bool f=false;
set<ll> s;
s.insert(0);
for(ll i=1,t=0,tmp;i<=n;i++){
cin>>tmp;
t+=((i&1)?1:-1)*tmp;
if(s.count(t))f=true;
else s.insert(t);
}
puts((f)?"YES":"NO");
}
return 0;
}