求助数据17-19RE
查看原帖
求助数据17-19RE
328170
Kalium楼主2023/2/25 22:31

真的求求了,看了好久找不到原因啊

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

2023/2/25 22:31
加载中...