P5367 【模板】康托展开

我们的生活充满了未知与玄学

----------------------------------------

链接:P5367

----------------------------------------

康拓展开在此题就是求一个全排列的排名。

我觉得它适合用来优化内存,这样存全排列虽然还要展开,但是内存小啊。

----------------------------------------

康拓展开的原理

----------------------------------------

首先,我们要求出阶乘,不然会TLE,

然后根据公式计算就可以了。

‘但是我们怎么知道对于每一个数,他是当前没有用过的数的排名呢?

我们可以用一个树状数组来维护,每使用一个,就在相应下标下-1。

询问时用树状数组求出的区间和就是排名了

------------------------------------------

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int t[1000001];
 5 int n;
 6 int mod=998244353;
 7 long long  f[1000001];
 8 int lowbit(int x){
 9     return x & -x;
10 }
11 void add(int x,int p){
12     while(p<=n){
13         t[p]+=x;
14         p+=lowbit(p);
15     }
16     return ;
17 }
18 int sum(int x){
19     int ans=0;
20     while(x){
21         ans+=t[x];
22         x-=lowbit(x);
23     }
24     return ans;
25 }
26 int now;
27 long long  anss;
28 int main(){
29     f[0]=1;
30     scanf("%d",&n);
31     for(int i=1;i<=n;++i)
32     f[i]=f[i-1]*i%mod;
33     for(int i=1;i<=n;++i)
34     add(1,i);
35     for(int i=n;i>=1;i--){
36         scanf("%d",&now);
37         anss+=(((sum(now)-1)*f[i-1])%mod)%mod;
38         anss%=mod;
39         add(-1,now);
40     }
41     printf("%lld\n",anss+1);
42     return 0;
43 } 
Ac
复制代码

 

posted @   Simex  阅读(281)  评论(6编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示