社区讨论
95分求调
P9937[USACO21OPEN] Acowdemia I B参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mdk07vba
- 此快照首次捕获于
- 2025/07/26 16:44 7 个月前
- 此快照最后确认于
- 2025/11/04 03:41 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,L,a[100010],l=0,r,ans,ansl,ansr;
int f1(int mid) {
if(a[ansl]==mid) {
int left=1,right=n;
while(left<right) {
int Mid=(left+right)/2;
if(Mid<=ansl-1&&Mid>=ansl-L) {
if(a[Mid]<mid-1) {
left=Mid+1;
} else {
right=Mid;
}
} else {
if(a[Mid]<mid) {
left=Mid+1;
} else {
right=Mid;
}
}
}
if((n-left+1)>=mid) {
return 1;
} else {
return 0;
}
} else {
int left=1,right=n;
while(left<right) {
int Mid=(left+right)/2;
if(Mid<=ansl&&Mid>=ansl-L+1) {
if(a[Mid]<mid-1) {
left=Mid+1;
} else {
right=Mid;
}
} else {
if(a[Mid]<mid) {
left=Mid+1;
} else {
right=Mid;
}
}
}
if((n-left+1)>=mid) {
return 1;
} else {
return 0;
}
}
}
int f2(int midd) {
int le=1,ri=n;
ansl=0,ansr=0;
while(le<ri) {
int mid=(le+ri+1)/2;
if(a[mid]<=midd) {
le=mid;
} else {
ri=mid-1;
}
ansl=le,ansr=ri;
}
return 0;
}
main() {
cin>>n>>L;
r=n+1;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
sort(a+1,a+n+1);
while(l<r) {
int m=(l+r+1)/2;
f2(m);
if(f1(m)==1) {
l=m,ans=m;
} else {
r=m-1;
}
}
cout<<ans;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...