简单分讨,WA on 4 调崩了
查看原帖
简单分讨,WA on 4 调崩了
417018
dark_moon楼主2024/7/19 17:28
#include<bits/stdc++.h>
#define int long long
using namespace std;
auto mread = [](){int x;scanf("%lld", &x);return x;};
int t = mread();
signed main(){
    while(t --){
        int n = mread();
        int a[n + 5];
        int la = -1, e = 1;
        for(int i = 1; i <= n; i ++){
            a[i] = mread();
            if(i > 1 && a[i] != -1 && a[i - 1] != -1){
                if(a[i] / 2 == a[i - 1] || a[i] == a[i - 1] / 2);
                else{
                    e = 0;
                }
            }
        }
        if(e == 0){
            printf("-1\n");
            continue;
        }
        for(int i = 1; i <= n; i ++){
            if(a[i] == -1){
                continue;
            }
            else{
                if(la == i - 1);
                else{
                    if(la == -1){
                        for(int j = i - 1; j >= 1; j --){
                            if(a[j + 1] == 1){
                                a[j] = 2;
                            }
                            else{
                                a[j] = a[j + 1] / 2;
                            }
                        }
                    }
                    else{
                        if(a[i] == a[la]){
                            if((i - la - 1) % 2 == 0){
                                e = 0;
                                break;
                            }
                            for(int j = la + 1; a[j] == -1; j ++){
                                if(a[j - 1] == a[i]){
                                    a[j] = a[j - 1] * 2;
                                }
                                else{
                                    a[j] = a[i];
                                }
                            }
                        }
                        else{
                            e = 0;
                            int now = 0, sum = 0, e2 = 0;
                            for(int j = a[la]; j; j /= 2){
                                sum = now;
                                for(int k = a[i]; k; k /= 2){
                                    if(j == k){
                                        e2 = 1;
                                        break;
                                    }
                                    sum ++;
                                }
                                if(e2){
                                    e2 = 0;
                                    int tmp = i - la - 1 - (sum - 1);
                                    if(tmp < 0 || tmp % 2 == 1){
                                        now ++;
                                        continue;
                                    }
                                    e = 1;
                                    int p;
                                    for(int k = la + 1; 1; k ++){
                                        if(a[k - 1] != j){
                                            a[k] = a[k - 1] / 2;
                                        }
                                        else{
                                            p = k;
                                            break;
                                        }
                                    }
                                    for(int k = i - 1; 1; k --){
                                        if(a[k + 1] != j){
                                            a[k] = a[k + 1] / 2;
                                        }
                                        else{
                                            break;
                                        }
                                    }
                                    for(int k = p; a[k] == -1; k ++){
                                        if(a[k - 1] == j){
                                            a[k] = a[k - 1] * 2;
                                        }
                                        else{
                                            a[k] = j;
                                        }
                                    }
                                    break;
                                }
                                now ++;
                            }
                            if(e == 0){
                                break;
                            }
                        }
                    }
                }
                la = i;
            }
        }
        if(e == 0){
            printf("-1\n");
            continue;
        }
        if(la == -1){
            a[1] = 1;
            la = 1;
        }
        for(int i = la + 1; i <= n; i ++){
            if(a[i - 1] == 1){
                a[i] = 2;
            }
            else{
                a[i] = a[i - 1] / 2;
            }
        }
        for(int i = 1; i <= n; i ++){
            assert(a[i] != -1);
            printf("%lld ", a[i]);
        }
        printf("\n");
    }
    return 0;
}
2024/7/19 17:28
加载中...