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
| const int N=2e5+10,INF=1e9+10;
int n; int lst[N],lst2[N],cnt; ll s1[N<<2],s2[N<<2]; int t[N<<2];
void Up(int p){ s2[p]=s2[p<<1]+s2[p<<1|1]; s1[p]=s1[p<<1]+s1[p<<1|1]+s2[p]*t[p]; } void Upd(int p,int l,int r,int x){ if(l==r) { s2[p]^=1,s1[p]=t[p]*s2[p]; return; } int mid=(l+r)>>1; x<=mid?Upd(p<<1,l,mid,x):Upd(p<<1|1,mid+1,r,x); Up(p); }
void Upd(int p,int l,int r,int ql,int qr,int x){ if(ql>qr) return; if(ql<=l && r<=qr) { t[p]+=x,s1[p]+=x*s2[p]; return; } int mid=(l+r)>>1; if(ql<=mid) Upd(p<<1,l,mid,ql,qr,x); if(qr>mid) Upd(p<<1|1,mid+1,r,ql,qr,x); Up(p); }
struct Node{ ll x,y; Node(ll x=0,ll y=0):x(x),y(y){ } Node operator + (const Node __) { return Node(x+__.x,y+__.y); } }; Node Que(int p,int l,int r,int ql,int qr){ if(ql>qr) return Node(); if(ql<=l && r<=qr) return Node(s1[p],s2[p]); int mid=(l+r)>>1; Node res; if(ql<=mid) res=res+Que(p<<1,l,mid,ql,qr); if(qr>mid) res=res+Que(p<<1|1,mid+1,r,ql,qr); res.x+=res.y*t[p]; return res; }
int main(){ n=rd(); ll ans=0; rep(i,1,n) { int x=rd(); if(lst[x]) { Upd(1,1,n,lst[x]),cnt--; Upd(1,1,n,lst2[x]+1,lst[x],-1); } Node t=Que(1,1,n,lst[x]+1,i-2); ans+=t.x; Upd(1,1,n,i),cnt++,Upd(1,1,n,lst[x]+1,i-1,1); lst2[x]=lst[x],lst[x]=i; } printf("%lld\n",ans); }
|