题目读懂了+想到逆序对 就很容易了 不然还是挺麻烦的
题中要产生K能量对应的隐含条件就是 有K对逆序对 (自己画图)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int tm[200000+5];
int vis[200000+5];
int main()
{
int n;
__int64 k; //注意要int64
scanf("%d%I64d",&n,&k);
int ok=0;
int i;
for (i=n;i>=1;i--)
{
if (k>=i-1)
{
k-=(i-1); //去掉
tm[++ok]=i; //存下来
vis[i]=1; //标记
}
if (k==0)break; //完成
}
int line=0; //控制格式
for (i=1;i<=ok;i++) //先输出 产生高能量
{
if (line!=0) printf(" ");
printf("%d",tm[i]);
line=1;
}
for (i=1;i<=n;i++) //因为能量已够,剩下的升序输出,代表不产生能量
{
if (vis[i]==0)
{
if (line!=0) printf(" ");
printf("%d",i);
}
line=1;
}
cout<<endl;
return 0;
}