蒟蒻树状数组 90分玄关求助
查看原帖
蒟蒻树状数组 90分玄关求助
510910
jiangmingshuai楼主2024/3/28 20:25

rt

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define low(x) (x&(-x))
const int N = 2e5+10,mod = 1e9+7;
int f[N],a[N],c[N],t[N],la[N],b[N];
int n,cnt,ans;
map<int,int> m;
void change(int x,int k){
	while(x<=cnt){
		t[x]+=k;
		t[x]%=mod;
		x+=low(x);
	}
}
int sum(int x){
	int res=0;
	while(x>0){
		res+=t[x];
		res%=mod;
		x-=low(x);
	}
	return res;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		b[i]=a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		if(!m[a[i]]){
			c[++cnt]=a[i];
			m[a[i]]=cnt;
		}
	}
	for(int i=1;i<=n;i++){
		int u=m[b[i]];
		int res=0;
		f[i]=sum(u);
		f[i]%=mod;
		res+=f[i]-la[u];
		ans+=res;
		ans%=mod;
		if(!la[u]){
			res+=1;
			res%=mod;
		}
		la[u]=f[i];
		change(u+1,res);
		change(cnt+1,-res);
	}
	ans%=mod;
	printf("%lld",ans);
	return 0;
}

测试点信息: 测试点

qiuqiule!

2024/3/28 20:25
加载中...