求hack(关注悬赏)
查看原帖
求hack(关注悬赏)
328170
Kalium楼主2023/2/25 20:32

真的求求了,被卡了好久了

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

int main() {
	scanf("%d", &T);
	
	while (T --) {
		memset(ans, 0, sizeof(ans));
		
		scanf("%d %lld %lld", &n, &a, &b);
		
		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, n >> 1), sum2 = sum((n >> 1) + 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;}
		
		ll lp = 1, rp = n;
		
		while (lp <= (n >> 1) && rp >= (n >> 1) + 1) {
			if (lp + cha1 > rp) {
				swap(ans[lp], ans[rp]);
				cha1 = cha1 - (ans[rp] - ans[lp]);
			} else {
				posl = lp, posr = rp;
				break;
			}
			
			lp ++, rp --;
		}
		
		if (posl + cha1 <= (n >> 1) && cha1) {
			if (posr - cha1 <= (n >> 1))
				swap(ans[posr - cha1], ans[posr]);
			else
				swap(ans[n >> 1], ans[(n >> 1) + cha1]);
				
			print(n, tmp1, tmp2);
			continue;
		}
		
		swap(ans[posl], ans[posl + cha1]);
		
		print(n, tmp1, tmp2);
	}
	
	return 0;
}
2023/2/25 20:32
加载中...