1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; const ll MAXN=static_cast<ll>(2e5)+10; ll N,T,A[MAXN]; inline void rightJ(int &j,map<ll,ll> &Cnt) { ++j; if(Cnt.find(A[j])!=Cnt.end()) { Cnt[A[j]]+=1; }else { Cnt[A[j]]=1; } } inline void rightI(int &i,map<ll,ll> &Cnt) { Cnt[A[i]]-=1; if(Cnt[A[i]]==0) Cnt.erase(A[i]); ++i; }
void solve(){ cin>>N; for(int i=1;i<=N;++i) { cin>>A[i]; } map<ll,ll> Cnt; Cnt[A[1]]=1; vector<ll> end(N+1); fill(end.begin(),end.end(),0); for(int i=1,j=1;j<=N && i<=N && i<=j;) { if(Cnt.size()==2) { end[i]=max(end[i],j*1LL); rightJ(j,Cnt); }else if(Cnt.size()==1) { rightJ(j,Cnt); }else { rightI(i,Cnt); } } ll ans=0; vector<ll> sumA(N+10); for(int i=1;i<=N;++i) { if(end[i]!=0) { unordered_map<ll,ll> sumCnt; sumA[i-1]=0; sumCnt[0]=1; ll flag=0; for(int j=i;j<=end[i];++j) { if(flag==A[j] || flag==0) { sumA[j]=sumA[j-1]+1; flag=A[j]; ans+=sumCnt.find(sumA[j])==sumCnt.end()? 0:sumCnt[sumA[j]]; sumCnt[sumA[j]]= sumCnt.find(sumA[j])==sumCnt.end()? 1:sumCnt[sumA[j]]+1; }else { sumA[j]=sumA[j-1]-1; ans+=sumCnt.find(sumA[j])==sumCnt.end()? 0:sumCnt[sumA[j]]; sumCnt[sumA[j]]= sumCnt.find(sumA[j])==sumCnt.end()? 1:sumCnt[sumA[j]]+1; } } } } cout<<ans<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while (T--) { solve(); } return 0; }
|