社区讨论

蒟蒻10分求助

P5367【模板】康托展开参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo96yecs
此快照首次捕获于
2023/10/28 06:35
2 年前
此快照最后确认于
2023/10/28 06:35
2 年前
查看原帖
RT,我用的是线段树来维护区间和以及单点修改,但不知道为啥一直WA
求大佬斧正QAQ
CPP
	#include<cstdio>
	#include<cstring>
	#include<algorithm>
	using namespace std;
	#define it long long
	int n,ans;
	const int mod=998244353;
	int num[1001000],jc[1001000];
	struct node{
		int l,r,sum;
	}tree[4004000];
	void pushup(int id)
	{
		tree[id].sum=(tree[id*2].sum+tree[id*2+1].sum)%mod;;
	}
	void build(int id,int l,int r)
	{
		tree[id].l=l;tree[id].r=r;
		if(l==r)
		{
			tree[id].sum=1;
			return;
		}
		int mid=(l+r)/2;
		build(id*2,l,mid);
		build(id*2+1,mid+1,r);
		pushup(id);
	}
	void make(int id,int p)
	{
		if(tree[id].l==tree[id].r&&tree[id].l==p)
		{
			tree[id].sum=0;
			return;
		}
		int mid=(tree[id].l+tree[id].r)/2;
		if(p<=mid)make(id*2,p);
		else make(id*2+1,p);
		pushup(id);
	}
	int find(int id,int l,int r)
	{
		if(l<=tree[id].l&&tree[id].r<=r)return tree[id].sum%mod;
		int sum=0;
		int mid=(tree[id].l+tree[id].r)/2;
		if(l<=mid)sum+=find(id*2,l,r),sum%=mod;
		if(r>mid)sum+=find(id*2+1,l,r),sum%=mod;
		return sum%mod;
	}
	signed main()
	{
		scanf("%lld",&n);
		jc[0]=1;
		for(int i=1;i<=n;++i)jc[i]=(jc[i-1]*i)%mod;
		build(1,1,n);
		for(int i=n-1;i>0;--i)
		{
			scanf("%lld",&num[i]);
			make(1,num[i]);			
			int cur=find(1,1,num[i]-1);
			ans=(ans+(jc[i]*cur)%mod)%mod;
		}
		++ans;
		printf("%lld",ans);
		return 0;
	}

回复

0 条回复,欢迎继续交流。

正在加载回复...