首页 > 其他 > 详细

P4165 [SCOI2007]组队

时间:2020-10-22 10:35:28      阅读:23      评论:0      收藏:0      [点我收藏+]

技术分享图片

感谢Twilight_Sx的题解

按身高排序,枚举身高最小值,原式

\[A\times(H-minh)+B\times(V-minv)\le C\A\times H+B\times V-C\le A\times minh+B\times minv \]

固定常量,令\(S_x=A\times H_x-C-A\times minh\)

\[S_x+B\times V_x\le B\times minv \]

移项可得

\[V_x-minv\le \frac{-S_x}B \]

又因为

\[V_x\ge minv \]

所以\(\frac{S_x}B+V_x\le minv \le V_x\) ,

所以我们在\(v\)范围上差分,取最大值即可

int n,A,B,C,mx,ans,a[10005];
struct node{
	int v,h;
	friend bool operator < (const node &a,const node &b){
		return a.h < b.h;
	}
}p[N];
void work(int x){
	int T = p[x].h * A;
	for(int i = x;i <= n;++i){
		int l = max(0,p[i].v - (T - A*p[i].h + C)/B);
		int r = p[i].v;
		if(l > r) continue;
		++a[l]; --a[r+1];
	}
	for(int i = 0,tem = 0;i <= mx;++i){
		a[i] += tem; tem = a[i];
		ans = max(ans,a[i]); a[i] = 0;
	}
}
int main(){
	n = read(); A = read(); B = read(); C = read();
	for(int i = 1;i <= n;++i){
		p[i].h = read(); p[i].v = read();
		mx = max(mx,p[i].v);
	}
	sort(p + 1,p + n + 1);
	for(int i = n;i >= 1;--i) work(i);
	printf("%d\n",ans);
}

P4165 [SCOI2007]组队

原文:https://www.cnblogs.com/shikeyu/p/13856243.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!