代码:
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int tree[100000],P[100009],n,m,i,j,k,F[100009]={1,1};
inline int lowbit(int x)
{
return x&(-x);
}
inline void update(int x,int y)
{
while(x<=n)
{
tree[x]+=y;
x+=lowbit(x);
}
}
inline int query(int x)
{
int ans=0;
while(x>0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
inline void Fact()
{
for(int i=1;i<=n;i++) F[i]=F[i-1]*i,update(i,1);
}
inline void Get_Cantor()
{
k=0;
for(int i=1;i<=n;i++)
{
cin>>P[i];
k=k+(query(P[i])-1)*F[n-i];
update(P[i],-1);
}
cout<<k+1<<endl;
}
inline void Get_Reverse_Cantor(int n,int x)
{
vector<int> res;
vector<int> ans;
res.empty();
ans.empty();
for(i=1;i<=n;i++) res.push_back(i);
for(i=n;i>=1;i--)
{
int r=x%F[i-1];
int c=x/F[i-1];
x=r;
sort(res.begin(),res.end());
ans.push_back(res[c]);
res.erase(res.begin()+c);
}
vector<int>::iterator it;
for(it=ans.begin();it!=ans.end();it++) cout<<*it<<" ";
cout<<endl;
}
signed main()
{
cin>>n>>m;
Fact();
int x;
for(int i=1;i<=m;i++)
{
char ch;
cin>>ch;
if(ch=='Q') Get_Cantor();
else if(ch=='P') cin>>x,Get_Reverse_Cantor(n,x-1);
}
return 0;
}
哪位大佬能帮忙看一下,谢谢了!