50分 MLE 求优化
查看原帖
50分 MLE 求优化
1023793
yaodiguoan楼主2024/5/24 18:00

record

#include <iostream>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
inline void write(int x){
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
const int N=1e6+10,mod=998244353;
namespace Segment_tree{
	#define ls (p<<1)
	#define rs (p<<1|1)
	#define mid (l+r>>1)
	struct node{long long value,tag;node(){value=0,tag=0;}};
	node segment_tree[N*4];
	void push_up(int p){segment_tree[p].value=(segment_tree[ls].value+segment_tree[rs].value)%mod;}
	void push_down(int l,int r,int p){
		if(!segment_tree[p].tag) return;
		segment_tree[ls].value=(segment_tree[ls].value+(mid-l+1)*segment_tree[p].tag%mod)%mod;
		segment_tree[rs].value=(segment_tree[rs].value+(r-mid)*segment_tree[p].tag%mod)%mod;
		segment_tree[ls].tag=(segment_tree[ls].tag+segment_tree[p].tag)%mod;
		segment_tree[rs].tag=(segment_tree[rs].tag+segment_tree[p].tag)%mod;
		segment_tree[p].tag=0;
	}
	void update(int lt,int rt,int l,int r,int p,int k){
		if(lt<=l&&r<=rt) return segment_tree[p].value=(segment_tree[p].value+k*(r-l+1)%mod)%mod,segment_tree[p].tag=(segment_tree[p].tag+k)%mod,void();
		push_down(l,r,p);
		if(lt<=mid) update(lt,rt,l,mid,ls,k);
		if(rt>mid) update(lt,rt,mid+1,r,rs,k);
		push_up(p);
	}
	int query(int lt,int rt,int l,int r,int p){
		if(lt<=l&&r<=rt) return segment_tree[p].value%mod;
		push_down(l,r,p);
		long long sum=0;
		if(lt<=mid) sum=query(lt,rt,l,mid,ls)%mod;
		if(rt>mid) sum=(sum+query(lt,rt,mid+1,r,rs)%mod)%mod;
		return sum%mod; 	
	} 
}
using namespace Segment_tree; 
int n,a[N];
long long fac[N],ans;
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		update(a[i],a[i],1,n,1,1);
	}
	fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	for(int i=1;i<n;i++){
		update(a[i],a[i],1,n,1,-1);
		if(a[i]>1)ans=(ans+query(1,a[i]-1,1,n,1)*fac[n-i])%mod;
	}
	write(ans+1);
	return 0;
}

2024/5/24 18:00
加载中...