E 求调
  • 板块学术版
  • 楼主wukaichen888
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/17 22:01
  • 上次更新2024/3/18 12:58:55
查看原帖
E 求调
723238
wukaichen888楼主2024/3/17 22:01
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const ll N=3e5+5,mod=998244353;
ll n,V,a[N],c[N],ans[N],P[N],FP[N],pr[N];
ll power(ll x,ll y){
	if(!y) return 1ll;
	ll z=power(x,y>>1ll);
	z=(z*z)%mod;
	if(y&1ll) return (z*x)%mod;
	return z;
}
void add(ll &x,ll y){x=(x+y)%mod;}
ll inv(ll x){return power(x,mod-2);}
bool vis[N];
struct node{ll cnt,sum,tag,tag2;}tree[N<<2];
#define lc k<<1
#define rc k<<1|1
#define ls lc,l,mid
#define rs rc,mid+1,r
void pushup(int k){
	tree[k].cnt=tree[lc].cnt+tree[rc].cnt;
}
void pushdown(int k){
	if(tree[k].tag){
		add(tree[lc].tag,tree[k].tag);
		add(tree[rc].tag,tree[k].tag);
		if(!tree[lc].tag2)
			add(tree[lc].sum,tree[k].tag);
		if(!tree[rc].tag2)
			add(tree[rc].sum,tree[k].tag);
		tree[k].tag=0;
	}
}
void change1(int k,int l,int r,int x,int y,ll d){
	if(x<=l&&r<=y){
		if(tree[k].tag2)
			return ;
		add(tree[k].sum,d);
		add(tree[k].tag,d);
		return ;
	}
	int mid=l+r>>1;
	pushdown(k);
	if(x<=mid) change1(ls,x,y,d);
	if(mid<y) change1(rs,x,y,d);
	pushup(k);
}
void pre(int k,int l,int r){
	if(l==r){
		tree[k].cnt=1;
		return ;
	}
	int mid=l+r>>1;
	pre(ls);pre(rs);
	pushup(k);
}
void change2(int k,int l,int r,int x){
	if(l==r){
		tree[k].cnt=0;
		tree[k].tag2=1;
		return ;
	}
	int mid=l+r>>1;
	pushdown(k);
	if(x<=mid) change2(ls,x);
	else change2(rs,x);
	pushup(k);
}
ll query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y) return tree[k].cnt;
	int mid=l+r>>1;
	pushdown(k);
	if(x<=mid&&mid<y) return query(ls,x,y)+query(rs,x,y);
	if(x<=mid) return query(ls,x,y);
	return query(rs,x,y);
}
void work(int k,int l,int r){
	if(l==r){
		ans[l]=(ans[l]+tree[k].sum)%mod;
		return ;
	}
	int mid=l+r>>1;
	pushdown(k);
	work(ls),work(rs);
}
ll A(ll x,ll y){return P[x]*FP[x-y]%mod;}
signed main(){
	scanf("%lld%lld",&V,&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	P[0]=FP[0]=1;
	for(int i=1;i<=V;i++) P[i]=P[i-1]*i%mod;
	for(int i=1;i<=V;i++) FP[i]=inv(P[i]);
	pre(1,1,V);
	for(ll i=1,x,y,v1,v2;i<=n;i++){
		if(a[i]==1) continue;
		x=query(1,1,V,1,a[i]-1);
		y=V-(i-1);
		if(x==0) continue;
		pr[i-1]=x*A(y-1,n-i)%mod;
		v1=(A(y-1,n-i)%mod+(x-1)*(n-i)%mod*A(y-2,n-i-1)%mod)%mod;
		v2=x*(n-i)%mod*A(y-2,n-i-1)%mod;
		change1(1,1,V,1,a[i]-1,v1);
		change1(1,1,V,a[i],V,v2);
		change2(1,1,V,a[i]);
	}
	work(1,1,V);
	for(int i=n;i;i--) add(pr[i],pr[i+1]);
	for(int i=1;i<=n;i++) add(ans[a[i]],pr[i]);
	for(int i=1;i<=n;i++) add(ans[a[i]],1);
	for(int i=1;i<=V;i++) printf("%lld\n",(ans[i]%mod+mod)%mod);
	return 0;
}
2024/3/17 22:01
加载中...