求助
查看原帖
求助
32490
memory_frv楼主2020/4/29 19:46

思路我懂可是为什么代码交上去只有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了

2020/4/29 19:46
加载中...