比赛 |
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;
}