求助随机化贪心
查看原帖
求助随机化贪心
285617
黑影洞人楼主2022/7/15 21:46
#include<cstdio>
#include<algorithm>
#include<set>
#define N 1145
#define itt set<seg>::iterator
using namespace std;
int seed=6;
bool rnd(){seed=(seed*23)%97;return seed&1;}
struct seg{
	int l,r;
	seg(int a=-1,int b=-1){l=a,r=b;}
	bool operator<(const seg &c)const{
		if(l==c.l)return rnd();
		else return l<c.l;
	}
};
set<seg> st;
int n,k,ans=-114514,tot,mn=1919810,cnt=0,a[N],b[N];
signed main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++){
		scanf("%d%d",&a[i],&b[i]);
		mn=min(mn,a[i]);
		st.insert(seg(a[i],a[i]+b[i]));
		//else cnt++;
	}
	//k-=cnt;
	for(int gg=1;gg<=1000;gg++){
		st.clear();
		for(int i=1;i<=k;i++){
			mn=min(mn,a[i]);
			st.insert(seg(a[i],a[i]+b[i]));
		//else cnt++;
		}tot=0;
		while(tot<k){
			itt it=st.begin();
			int len=it->r-it->l;
			if(it->l!=mn)break;
			while(it->l<=n){
				int r=it->r;
				//printf("%d %d %d\n",it->l,it->r,tot);
				st.erase(it);tot++;
				it=st.lower_bound(seg(r,0));
				if(it==st.end())break;
				len+=it->r-it->l;
			}
			//printf("ans:%d\n",n-len);
			ans=max(ans,n-len);
		}
	}
	
	printf("%d",ans);
	return 0;
}



2022/7/15 21:46
加载中...