社区讨论
关于二分答案做法
P2859[USACO06FEB] Stall Reservations S参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhj1kqww
- 此快照首次捕获于
- 2025/11/03 19:13 4 个月前
- 此快照最后确认于
- 2025/11/03 19:13 4 个月前
rt 我用二分答案 WA 了只有 10pts。
想二分得出 看 个槽位可不可以供这 头奶牛使用,数组按区间右端点排序以记录每个槽位的结束时间。求出答案后用同样的方法求出方案。时间复杂度 。
个人认为这种做法的正确性没有问题,但是 WA 了,求调。(码风你先别管)
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,ans,tim,w[50005];
map<int,int>cao;
struct lilaoshi{
int l,r,id;
}lj[50005];
bool cmp(lilaoshi x,lilaoshi y){
if(x.r==y.r)return x.l<y.l;
return x.r<y.r;
}
bool check(int x){
for(int i=1;i<=x;i++)cao[i]=0;
int j=1,cnt=1,youxian=1;
bool pec=false;
for(int i=1;i<=tim;i++){
bool jiaru=false;
if((cao[cnt]<lj[j].l||cao[youxian]<lj[j].l)&&lj[j].l<=i){
jiaru=true;
if(cao[youxian]<i){
cao[youxian]=lj[j].r;
if(j==n){
pec=true;
return true;
}
j++;
if(youxian==cnt)cnt++;
else youxian++;
if(youxian>n)youxian=1;
continue;
}
cao[cnt]=lj[j].r;
if(j==n)return true;
j++;
cnt++;
if(cnt>x)cnt=1;
continue;
}
if(cao[cnt]>=i&&!jiaru){
if(lj[j].l==i){
return false;
}
}
}
if(!pec)return false;
}
int erfen(int l,int r){
while(l<r){
int mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid+1;
}
return l;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>lj[i].l>>lj[i].r;
lj[i].id=i;
tim=max(tim,lj[i].r);
}
sort(lj+1,lj+1+n,cmp);
cout<<erfen(1,n)<<endl;
ans=erfen(1,n);
for(int i=1;i<=ans;i++)cao[i]=0;
int j=1,cnt=1,youxian=1;
for(int i=1;i<=tim;i++){
if((cao[cnt]<lj[j].l||cao[youxian]<lj[j].l)&&lj[j].l<=i){
if(cao[youxian]<i){
cao[youxian]=lj[j].r;
w[lj[j].id]=youxian;
if(j==n)break;
j++;
if(youxian==cnt)cnt++;
else youxian++;
if(youxian>n)youxian=1;
continue;
}
cao[cnt]=lj[j].r;
w[lj[j].id]=cnt;
if(j==n)break;
j++;
cnt++;
if(cnt>ans)cnt=1;
continue;
}
}
for(int i=1;i<=n;i++)cout<<w[i]<<endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...