P1338 末日的传说

说实话我真没思路

#include <iostream>
#include <cstdio>
using namespace std;
long long n,m,a[50002],num,last,fir;
int main(){
	scanf("%lld%lld",&n,&m);
	last=n;fir=1;
	for(int i=1;i<=n;i++){
		long long num=(long long)((n-i-1)*(n-i))/2;//全排列数量
		if(num>=m)
			a[fir++]=i;
		if(num<m) 	a[last--]=i,m=m-(last-fir+1);
		
	}
	for(int i=1;i<=n;i++)
		printf("%lld ",a[i]);
	return 0;
}//long long的问题,50,100。last和fir的问题。 虽然这个题解有点问题,但是
//解决了我按权给值加逆序对的问题。就是能用小的解决的绝不用大的,既然用大的说明不能用小的替代只好用他的最大价值 

 

posted @ 2019-10-08 10:45  sdzmq  阅读(122)  评论(0编辑  收藏  举报