比赛 2024暑假C班集训9 评测结果 EEEEEEEEEE
题目名称 机场改建 最终得分 0
用户昵称 彭欣越 运行时间 2.239 s
代码语言 C++ 内存使用 8.02 MiB
提交时间 2024-07-09 10:31:50
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int t,n,d,a[200010],mk[200010],res[200010];
void dfs (int x) {
    if (x>n) return;
    int res1,res2;
    int a1=0,a2=0,b1=0,b2=0;
    int l=a[x]-d,r=a[x]+d;
    if (mk[l]==1||mk[r]==1) {
        res[x]=0;
        mk[a[x]]=1;
        //cout << a[x] <<' ';
        dfs(x+1);
        //cout <<endl;
        mk[a[x]]=0;
        return;
    }
    for (int i=1;;i++) {
        if (mk[l-i]||mk[l+i]) {
            res1=i;
            if (mk[l-i]) a1=a[x]-i;
            if (mk[l+i]) a2=a[x]+i;
            break;
        }
    }
    //cout << 1 <<endl;
    for (int i=1;;i++) {
        if (mk[r-i]||mk[r+i]) {
            res2=i;
            if (mk[r-i]) b1=a[x]-i;
            if (mk[r+i]) b2=a[x]+i;
            break;
        }
    }
    if (res1==res2) {
        res[x]=res1;
        if (a1) {
            mk[a1]=1;
            //cout << a1 <<' ';
            dfs(x+1);
            //cout <<endl;
            mk[a1]=0; 
        }
        if (a2) {
            mk[a2]=1;
            //cout << a2 <<' ';
            dfs(x+1);
            //cout <<endl;
            mk[a2]=0; 
        }
        if (b1) {
            mk[b1]=1;
            //cout << b1 <<' ';
            dfs(x+1);
            //cout <<endl;
            mk[b1]=0; 
        }
        if (b2) {
            mk[b2]=1;
            //cout << b2 <<' ';
            dfs(x+1);
            //cout <<endl;
            mk[b2]=0; 
        }
        return;
    }else{
        res[x]=min(res1,res2);
        if (res1<res2) {
            if (a1) {
                mk[a1]=1;
                //cout << a1 <<' ';
                dfs(x+1);
                //cout <<endl;
                mk[a1]=0; 
            }
            if (a2) {
                mk[a2]=1;
                //cout << a2 <<' ';
                dfs(x+1);
                //cout <<endl;
                mk[a2]=0; 
            }
            return;
        }else{
            if (b1) {
                mk[b1]=1;
                //cout << b1 <<' ';
                dfs(x+1);
                //cout <<endl;
                mk[b1]=0; 
            }
            if (b2) {
                mk[b2]=1;
                //cout << b2 <<' ';
                dfs(x+1);
                //cout <<endl;
                mk[b2]=0; 
            }
            return;
        }
    }
}
int main () {
    freopen("airport.in","r",stdin);
    freopen("airport.out","w",stdout);
    cin >> t;
    while (t--) {
        cin >> n >> d;
        for (int i=1;i<=n;i++) cin >> a[i];
        mk[a[1]]=1;
        dfs(2);
        mk[a[1]]=0;
        for (int i=1;i<=n;i++) {
            res[i]+=res[i-1];
            cout << res[i] <<' ';
        }
        cout <<endl; 
    }
    return 0;
}