真的求求了,看了好久找不到原因啊
#include <iostream>
#include <cstring>
#include <cstdio>
#define ll long long
const int N = 1e5 + 7;
using namespace std;
int T, n;
ll a, b;
ll ans[N];
inline ll sum(int l, int r) {
ll tmp = 0;
for (int i = l; i <= r; ++ i) tmp += ans[i];
return tmp;
}
inline void print(int n, ll tmp1, ll tmp2) {
if (tmp1 <= tmp2) {
for (int i = 1; i <= n; ++ i)
printf("%lld ", ans[i]);
} else {
for (int i = n; i >= 1; -- i)
printf("%lld ", ans[i]);
}
printf("\n");
return ;
}
int main() {
scanf("%d", &T);
while (T --) {
memset(ans, 0, sizeof(ans));
scanf("%d %lld %lld", &n, &a, &b);
int mid = n >> 1;
ll tmp1 = a, tmp2 = b;
if (a > b) swap(a, b);
for (int i = 1; i <= n; ++ i) ans[i] = i;
ll sum1 = sum(1, mid), sum2 = sum(mid + 1, n);
if (sum2 < b) {printf("-1\n"); continue;}
if (sum1 >= a && sum2 >= b) {print(n, tmp1, tmp2); continue;}
int posl = 0, posr = 0;
ll cha1 = a - sum1, cha2 = sum2 - b;
if (cha1 > cha2) {printf("-1\n"); continue;}
int lp = 1, rp = n;
while (lp <= mid && rp >= mid + 1) {
if (1ll * lp + cha1 > 1ll * rp) {
swap(ans[lp], ans[rp]);
cha1 = cha1 - (ans[rp] - ans[lp]);
} else {
posl = lp, posr = rp;
break;
}
lp ++, rp --;
}
if (posl + cha1 <= mid) {
swap(ans[mid], ans[mid + cha1]);
print(n, tmp1, tmp2);
} else {
swap(ans[posl], ans[posl + cha1]);
print(n, tmp1, tmp2);
}
}
return 0;
}