社区讨论

求调

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 条回复,欢迎继续交流。

正在加载回复...