AT_arc119_c [ARC119C] ARC Wrecker 2
AT_arc119_c [ARC119C] ARC Wrecker 2
一道性质题,这种题据大佬说是找不变的东西来判断合法性,就比如这题,每次加减只能在相邻的数力里操作,所以可以发现,在任意一区间中把下表为奇数的数和下标为偶数的数分为两个序列,这两个序列的元素和的差无论怎么加减都是不变的,那么就考虑一个区间的这个差满足什么条件时此区间合法。
手模一下,发现对于
做法就是顺序扫,前缀和
#include<bits/stdc++.h>
using namespace std;
#define MAXN 300010
#define ll long long
int n,a[MAXN];
ll s1[MAXN],s2[MAXN];
map<ll,int>ds;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
ll ans=0;
ds[0]=1;
for(int i=1;i<=n;i++)
{
if(i&1)s1[i]=s1[i-1]+a[i],s2[i]=s2[i-1];
else s2[i]=s2[i-1]+a[i],s1[i]=s1[i-1];
ans+=ds[s2[i]-s1[i]];
ds[s2[i]-s1[i]]++;
}
printf("%lld\n",ans);
return 0;
}