80分求助
查看原帖
80分求助
482007
TanX_1e18楼主2023/7/25 16:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
int top,n,c[100009],t[100009],f[100009],ans;
const int mod=1e9+7;
struct dian
{
	int x,v,v1;
}a[100009];
bool cmp1(dian i,dian j)
{
	return i.v<j.v;
}
bool cmp2(dian i,dian j)
{
	return i.x<j.x;
}
int d[100009];
int lowbit(int x)
{
	return x&-x;
}
void add(int x,int k)
{
	k=(k%mod+mod)%mod;
	while(x<=n)
	{
		d[x]+=k;
		d[x]=(d[x]%mod+mod)%mod;
		x+=lowbit(x);
	}
}
int find(int x)
{
	int rtd=0;
	while(x)
	{
		rtd+=d[x];
		x-=lowbit(x);
		rtd=(rtd%mod+mod)%mod;
	}
	return rtd;
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>c[i];
	}
	c[0]=-(1e11+7);
	for(int i=1;i<=n;i++)
	{
		if(c[i]==c[i-1])
		continue;
		top++;
		a[top].v=c[i];
		a[top].x=top;
	}
	n=top;
	sort(a+1,a+n+1,cmp1);
	top=0;
	a[0].v=-(1e11+7);
	for(int i=1;i<=n;i++)
	{
		if(a[i].v!=a[i-1].v)
		top++;
		a[i].v1=top;
	}
	sort(a+1,a+n+1,cmp2);
	for(int i=1;i<=n;i++)
	{
		if(t[a[i].v1])
		add(a[t[a[i].v1]].v1,-f[t[a[i].v1]]);
		f[i]=find(a[i].v1-1)+1;
		f[i]=(f[i]%mod+mod)%mod;
		ans+=f[i];
		ans=(ans%mod+mod)%mod;
		add(a[i].v1,f[i]);
		t[a[i].v1]=i;
	}
	cout<<ans-n;
	return 0;
}
2023/7/25 16:12
加载中...