比赛 EYOI与SBOI开学欢乐赛6th 评测结果 AAAAAAAAAA
题目名称 充电宝 最终得分 100
用户昵称 op_组撒头屯 运行时间 4.368 s
代码语言 C++ 内存使用 8.86 MiB
提交时间 2022-09-19 20:06:44
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=200000+5;
int n,t,cnt=0;
int a[N];
int pos[N]={0},lst[N],nxt[N];
int num[N]={0};
struct sdf{
    int l,r;
}q[N];
long long ans=0;
bool cmp(sdf x,sdf y){
    if (x.l/t!=y.l/t)return x.l<y.l;
    if ((x.l/t)&1)return x.r<y.r;
    else return x.r>y.r;
}
void add(int x){
    if (num[a[x]]==0)cnt++;
    num[a[x]]++;return ;
}
void del(int x){
    if (num[a[x]]==1)cnt--;
    num[a[x]]--;return ;
}
int main(){
	freopen ("charger.in","r",stdin);
	freopen ("charger.out","w",stdout);
	scanf("%d",&n);t=sqrt(n);
	for (int i=1;i<=n;i++)lst[i]=0,nxt[i]=n+1;
	for (int i=1;i<=n;i++){
	    scanf("%d",&a[i]);
	    nxt[pos[a[i]]]=i;
	    pos[a[i]]=i;
    }
    for (int i=1;i<=n;i++)q[i]={i+1,nxt[i]-1};
    sort(q+1,q+n+1,cmp);
    int l=1,r=0;
    for (int i=1;i<=n;i++){
        while(l>q[i].l)add(--l);
        while(r<q[i].r)add(++r);
        while(l<q[i].l)del(l++);
        while(r>q[i].r)del(r--);
        ans+=cnt;
    }
    printf("%lld\n",ans);
    return 0;
}