社区讨论
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 条回复,欢迎继续交流。
正在加载回复...