10pts求调调调调调
查看原帖
10pts求调调调调调
958142
King_AC楼主2024/5/1 20:44
#include<bits/stdc++.h>
#define lx (x<<1)
#define rx (x<<1|1)
using namespace std;
const long long MAX_N = 4*1e6+5, mod = 998244353;
typedef long long ll;
ll tr[MAX_N], fact[MAX_N], n, temp, ans1 = 1;
void data(int x){
	tr[x] = (tr[lx]+tr[rx])%mod;
	return;
}
void build(int x, int l, int r){
	if (l==r){
		tr[x] = 1;
		return ;
	}
	int mid = (l+r)>>1;
	build(lx,l,mid);
	build(rx,mid+1,r);
	data(x);
	return;
}
ll find1(int A, int B, int l, int r, int x){
	if (A>B) return 0;
	if (l>=A&&r<=B) return tr[x];
	int mid = (l+r)>>1;
	ll ans = 0;
	if (A<=mid) ans+=find1(A,B,l,mid,lx)%mod;
	if (B>=mid+1) ans+=find1(A,B,mid+1,r,rx)%mod;
	return ans%mod;
}
void change(int l, int r, int x, int t){
	if (l==r){
		tr[x] = 0;
		return;
	}
	int mid = (l+r)>>1;
	if (t<=mid) change(l,mid,lx,t);
	else change(mid+1,r,rx,t);
	data(x);
	return;
}
int main()
{
	cin >> n;
	fact[1] = 1;
	for (int i = 2; i <= n; i++){
		fact[i] = (fact[i-1]*i)%mod;
	}
	build(1,1,n);
	for (int i = 1; i <= n ; i++){
		cin >> temp;
		change(1,n,1,temp);
		ans1+=((find1(1,temp-1,1,n,1)*fact[n-i]%mod)%mod);
	}
	cout << ans1;
	return 0;
}

2024/5/1 20:44
加载中...