题意理解
感觉这不是数学题,是一个贪心。从1开始考虑,如果放在最后,那么就有 N−1 个逆序对是以1为后边的,如果放前面,那么就有0个。
然后同样是个数相同的逆序对,逆序越靠后,数字越小,因为靠前面的数字影响要大一些。
所以我在写题解的时候,想到应该从后往前贪计算更简单一些。应该可以不需要计算那个temp了。如果有谁这么写并且写对了可以联系我一下:)
代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;
public class Main {
static int N;
static long M;
static final int maxn = 50050;
static int[] a = new int[maxn];
public static void main(String[] args) {
FastScanner fs = new FastScanner();
N = fs.nextInt();
M = fs.nextLong();
int last = N;
int first = 1;
for (int i = 1; i <= N; i++) {
long x = 1;
long temp = x * (N - i) * (N - i - 1) / 2;
if (M <= temp) {
a[first++] = i;
} else {
a[last--] = i;
M -= (last - first + 1);
}
}
for (int i = 1; i <= N; i++) {
pw.print(a[i] + " ");
}
pw.close();
}
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public String nextToken() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (Exception e) {
// TODO: handle exception
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.valueOf(nextToken());
}
public long nextLong() {
return Long.valueOf(nextToken());
}
}
}