求助,一直10分
查看原帖
求助,一直10分
509528
RE_Prince楼主2022/1/1 17:27

代码:

#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;
}

哪位大佬能帮忙看一下,谢谢了!

2022/1/1 17:27
加载中...