80分求助
查看原帖
80分求助
705012
Miss_SGT楼主2023/5/2 10:41
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,mx=1e5+5;
void read(int &x){
  	int f=1;x=0;char s=getchar();
  	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
  	while(s>='0'&&s<='9')x=x*10+s-'0',s=getchar();
  	x*=f;
}
int n,nw[mx],num;
struct node{int x,id;}a[mx]; 
bool cmp(node a,node b){return a.x<b.x;}
long long t[mx];
inline int lowbit(int p){return p&(-p);}
inline void add(int p,int v){
	while(p<=n){
		t[p]=1ll*(t[p]+v)%mod;
		p+=lowbit(p);
	}
}inline long long get(int p){
	long long ans=0;
	while(p){
		ans=(ans+t[p])%mod;
		p-=lowbit(p);
	}return ans;
}long long ans,x,sum,p[mx],xs;
bool vis[mx];
int main(){
	read(n);
	for(int i=1;i<=n;i++){
		read(a[i].x);
		a[i].id=i;
	}sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(i!=1&&a[i].x==a[i-1].x) nw[a[i].id]=num;
		else nw[a[i].id]=++num;
	}for(int i=n;i;i--){
		x=(sum-get(nw[i])+mod)%mod;
		ans=(ans+x-p[nw[i]]+mod)%mod;
		if(!vis[nw[i]]){
			sum=(sum+x+1)%mod;
			add(nw[i],x+1);
			vis[nw[i]]=1;
		}p[nw[i]]=x;
	}printf("%lld\n",ans);
	return 0;
}

2023/5/2 10:41
加载中...