思路我懂可是为什么代码交上去只有5分,其他全wa,对拍了很多样例暂时还没找到问题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
map<int,int> mp;
long long ans=0;
const int mod=1e9+7;
int n,cnt=0,ap[1000001];
long long x[1000001],y[1000001],lst[100001];
bool vis[1000001];
struct tree{
long long l,r,sum,sqsum,lazy;
}a[500001];
inline void build(int lef,int rig,int root){
a[root].l=lef,a[root].r=rig;
if(lef==rig){
return ;
}
int mid=(lef+rig)/2;
build(lef,mid,root*2);
build(mid+1,rig,root*2+1);
}
inline void pushdown(int x){
if(a[x].lazy){
a[x*2].lazy=a[x].lazy;
a[x*2+1].lazy=a[x].lazy;
a[x*2].sqsum=(a[x*2].sqsum+(a[x*2].r-a[x*2].l+1)*a[x*2].lazy*a[x*2].lazy+2*a[x*2].sum*a[x*2].lazy)%mod;
a[x*2+1].sqsum=(a[x*2+1].sqsum+(a[x*2+1].r-a[x*2+1].l+1)*a[x*2+1].lazy*a[x*2+1].lazy+2*a[x*2+1].sum*a[x*2+1].lazy)%mod;
a[x*2].sum=(a[x*2].sum+(a[x*2].r-a[x*2].l+1)*a[x*2].lazy)%mod;
a[x*2+1].sum=(a[x*2+1].sum+(a[x*2+1].r-a[x*2+1].l+1)*a[x*2+1].lazy)%mod;
a[x].lazy=0;
}
}
inline void add(int bg,int en,int root,int ad){
if(a[root].l>=bg&&a[root].r<=en){
a[root].lazy+=ad;
a[root].sqsum=(a[root].sqsum+(a[root].r-a[root].l+1)*ad*ad+2*a[root].sum*ad)%mod;
a[root].sum=(a[root].sum+(a[root].r-a[root].l+1)*ad)%mod;
pushdown(root);
return ;
}
pushdown(root);
int mid=(a[root].l+a[root].r)/2;
if(bg<=mid) add(bg,en,root*2,ad);
if(en>mid) add(bg,en,root*2+1,ad);
a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;
a[root].sqsum=(a[root*2].sqsum+a[root*2+1].sqsum)%mod;
}
inline void query(int bg,int en,int root){
if(a[root].l>=bg&&a[root].r<=en){
ans=(ans+a[root].sqsum)%mod;
return ;
}
pushdown(root);
int mid=(a[root].l+a[root].r)/2;
if(bg<=mid) query(bg,en,root*2);
if(en>mid) query(bg,en,root*2+1);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&x[i]);
if(!mp[x[i]]){
mp[x[i]]=++cnt;
}
y[i]=mp[x[i]];
lst[i]=ap[y[i]];
ap[y[i]]=i;//3 3 2 1
}
build(1,n,1);
long long as=0;
for(int i=1;i<=n;i++){
add(lst[i]+1,i,1,1);
ans=0;
query(1,i,1);
as=(as+ans)%mod;
}
cout<<as%mod;
return 0;
}
球球各位dalao了