社区讨论
蒟蒻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 条回复,欢迎继续交流。
正在加载回复...