社区讨论
求调
P15289「YLLOI-R3-T4」止战之殇参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mljajfs3
- 此快照首次捕获于
- 2026/02/12 18:03 上周
- 此快照最后确认于
- 2026/02/15 09:40 4 天前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int n,a,d,b[N],ans;
bool vis[N];
int dx[]={-2,-1,0,1,2};
int cnt[N];
queue<int> q;
void dfs(int x,int step){
bool flag=false;
for (int i=0;i<5;i++){
int nx=x+dx[i];
if (nx>=1 && nx<n){
if (b[nx]-2*d>=2){
flag=true;
break;
}
}
}
if (!flag){
ans=max(ans,step);
return ;
}
for (int i=0;i<5;i++){
int nx=x+dx[i];
if (nx>=n || nx<1) continue;
if (b[nx]-2*d>=2){
b[nx]-=2*d;
dfs(nx,step+1);
b[nx]+=2*d;
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>a>>d;
for (int i=1;i<n;i++) cin>>b[i];
if (n<=11){
dfs(a,0);
cout<<ans;
return 0;
}
bool flag=false;
for (int i=1;i<n;i++){
if (b[i]>=2*d+2) flag=true;
}
if (!flag){
cout<<0;
return 0;
}
for (int i=1;i<n;i++){
if (b[i]>=2) cnt[i]=(b[i]-2)/(2*d);
}
for (int i=1;i<n;i++){
if (vis[i] || cnt[i]==0) continue;
queue<int> q;
q.push(i);
vis[i]=1;
int sum=0,flag2=0;
while (!q.empty()){
int x=q.front();q.pop();
sum+=cnt[x];
if (abs(x-a)<=2) flag2=1;
for (int j=0;j<5;j++){
int nx=x+dx[j];
if (nx>=1 && nx<n && cnt[nx]>=1 && vis[nx]==0) vis[nx]=1,q.push(nx);
}
}
if (flag2) ans=max(ans,sum);
}
cout<<ans;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...