10tps求调
查看原帖
10tps求调
781159
Lovely_Elaina楼主2023/2/1 21:04
#include <iostream>
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;

int T,n,a,b;
int p[1000005],_end;

bool build(int x,int y){
    if(x < a){
        int i = 1;
        while(x < a && y >= b && i <= _end){
            if(p[i] < p[i+1]){
                x = x + p[i+1] - p[i];
                y = y + p[i] - p[i+1];
                swap(p[i],p[i+1]);
                i += 2;
            }else i += 2;
        }
    }
    else{
        int i = 1;
        while(y < b && x >= a && i <= _end){
            if(p[i] > p[i+1]){
                y = y + p[i+1] - p[i];
                x = x + p[i] - p[i+1];
                swap(p[i],p[i+1]);
                i += 2;
            }else i += 2;
        }
    }

    if(!(x >= a && y >= b))
        return 1;
    return 0;
}

// construct_numbers_sequence
bool c_n_s(){
    int odd=0,even=0;

    for(int i = 1; i < n; i+=2){
        p[i] = i;
        odd += p[i];
    }
    for(int i = 2; i <= n; i+=2){
        p[i] = i;
        even += p[i];
    }

    if(odd >= a && even >= b)
        return 1;
    
    int qwq = (odd+even) / 2;
    if(qwq < min(a,b) && qwq+1 < max(a,b))
        return 0;

    if(build(odd,even))
        return 0;

    return 1;
}

int main() {

    scanf("%d",&T);
    while(T--){
        scanf("%d %d %d",&n,&a,&b);
        _end = n / 2;
        if(c_n_s()){
            printf("%d",p[1]);
            for(int i = 2; i <= n; i++)
                printf(" %d",p[i]);
            putchar(10);
        }else printf("-1\n");
    }

    return 0;
}
2023/2/1 21:04
加载中...