社区讨论

WA_95pts 求条qwq

P5844 [IOI 2011] ricehub参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhj0we5n
此快照首次捕获于
2025/11/03 18:54
4 个月前
此快照最后确认于
2025/11/03 18:54
4 个月前
查看原帖
思路类似于双指针
CPP

#include <bits/stdc++.h>
#define ll long long
#define pll pair<ll,ll>
using namespace std;

ll r,l,b, x[100100], ans = 1;

int main(){
    
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    
    cin>>r>>l>>b;

    ll cnt = 0;

    for(int i=1;i<=r;++i){
        cin>>x[i];

        if(i > 1 && x[i] != x[i-1]){
            ans = max(ans,cnt);
            cnt = 1;
        }else{
            ++cnt;
        }
    }
    if(cnt > 0) ans = max(ans, cnt);

    if(b == 0){    //特判
        cout<<ans;
        return 0;
    }

    ll tmp = 1, lt = 0,rt = 0;
    cnt = 0;
    while(tmp+1 <= r && cnt + (x[tmp+1] - x[1]) <= b){
        ++tmp;

        cnt += x[tmp] - x[1];
        ++rt;
    }

    // cout<<cnt<<' '<<lt<<' '<<rt<<'\n';
    for(int i=2;i<=r;++i){

        cnt = cnt + (lt+1)*(x[i]-x[i-1]) - rt*(x[i]-x[i-1]);

        ++lt;
        rt = max(0ll,rt-1ll);

        while(cnt > b && lt > 0){
            // cout<<'-';
            cnt -= x[i]-x[i-lt];
            lt--;
        }

        while(lt > 0 && i+rt+1 <= r && x[i]-x[i-lt] > x[i+rt+1]-x[i]){
            // cout<<'*';
            rt++;
            cnt -= (x[i]-x[i-lt]) - (x[i+rt]-x[i]);
            lt--;
        }
        while(i+rt+1 <= r && cnt + (x[i+rt + 1] - x[i]) <= b){
            // cout<<'&';
            rt++;
            cnt += x[i+rt]-x[i];
        }

        ans = max(ans, lt+rt+1);
        // cout<<cnt<<' ';
        // cout<<lt<<' '<<rt<<'\n';
    }
    cout<<ans;
    
    return 0;
}

可壶关

回复

0 条回复,欢迎继续交流。

正在加载回复...