首先我们只关注大小数量关系,所以把小于b的设为-1,大于b的设为1,只要区间包含b且和为0即为合法
统计时用桶记录左和右边sum出现的次数,把左+右==0的乘起来记到答案里
都是比较套路的吧
#include<bits/stdc++.h> using namespace std; const int maxn=200009; int n,b,a[maxn],p,ans; int sum[maxn],lc[maxn],rc[maxn]; int main(){ scanf("%d%d",&n,&b); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i]<b)a[i]=-1; if(a[i]>b)a[i]=1; if(a[i]==b)p=i; } lc[n]=1;rc[n]=1; for(int i=p+1;i<=n;i++){ sum[i]=sum[i-1]+a[i]; lc[n+sum[i]]++; } for(int i=p-1;i>=1;i--){ sum[i]=sum[i+1]+a[i]; rc[n+sum[i]]++; } for(int i=-n;i<=n-1;i++){ ans+=lc[i+n]*rc[-i+n]; } printf("%d",ans); }
原文地址:https://www.cnblogs.com/superminivan/p/11730238.html
时间: 2024-10-31 08:53:56