社区讨论

关于二分答案做法

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。
想二分得出 midmidmidmid 个槽位可不可以供这 nn 头奶牛使用,数组按区间右端点排序以记录每个槽位的结束时间。求出答案后用同样的方法求出方案。时间复杂度 O(n)O(n)
个人认为这种做法的正确性没有问题,但是 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 条回复,欢迎继续交流。

正在加载回复...