1071: [SCOI2007]组队 - BZOJ
Description
NBA每年都有球员选秀环节。通常用速度和身高两项数据来衡量一个篮球运动员的基本素质。假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有队员都应该满足: A * ( height – minH ) + B * ( speed – minV ) <= C 其中A和B,C为给定的经验值。这个式子很容易理解,如果一个球队的球员速度和身高差距太大,会造成配合的不协调。 请问作为球队管理层的你,在N名选秀球员中,最多能有多少名符合条件的候选球员。
Input
第一行四个数N、A、B、C 下接N行每行两个数描述一个球员的height和speed
Output
最多候选球员数目。
Sample Input
4 1 2 10
5 1
3 2
2 3
2 1
Sample Output
4
HINT
数据范围: N <= 5000 ,height和speed不大于10000。A、B、C在长整型以内。
做了这道题,我深深的体会到了longint和int64时间上的差异(因为最开始用的是int64,怕乘起来会爆longint)
现在开始分析题目
把那个式子变一下,就变成了a*x+b*y<=c+a*minx+b*miny(注意x>=minx,y>=miny)
我们暴力的想法是O(n^3)先枚举minx和miny,再枚举可行的点
因为a*x+b*y是定值,所以我们先排序,在枚举枚举minx时把比minx小的点删掉,枚举miny的时候把比miny小的点删掉(注意不要重复删除)
然后可以用树状数组维护和的信息,这样是O(n^2*logn)的
但是我们可以做得更好,我们从小到大枚举minx和miny,minx确定后c+a*minx+b*miny是递增的,所以只要拿一个指针往后移加到sum里去就行了(确定minx后把信息全部赋为初值)
这样就是O(n^2)的,用pascal的同学千万别用int64,用longint快一些,int64TLE无数
const
maxn=;
type
aa=array[..maxn]of longint;
var
n,num,a,b,c:longint;
x,y,z,k,yi,zi:aa; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint;var a,b:aa);
var
i,j,y:longint;
begin
i:=l;
j:=r;
y:=a[(l+r)>>];
repeat
while a[i]<y do
inc(i);
while a[j]>y do
dec(j);
if i<=j then
begin
swap(a[i],a[j]);
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r,a,b);
if j>l then sort(l,j,a,b);
end; procedure init;
var
i:longint;
begin
read(n,a,b,c);
for i:= to n do
read(x[i],y[i]);
sort(,n,x,y);
for i:= to n do
begin
k[i]:=y[i];
yi[i]:=i;
end;
sort(,n,k,yi);
for i:= to n do
begin
k[i]:=i;
zi[i]:=a*x[i]+b*y[i];
end;
sort(,n,zi,k);
for i:= to n do
if (zi[i]=zi[i-]) and (i<>) then z[k[i]]:=z[k[i-]]
else z[k[i]]:=z[k[i-]]+;
num:=;
for i:= to n do
if zi[i]<>zi[i-] then
begin
inc(num);
zi[num]:=zi[i];
end;
end; var
vis:array[..maxn]of boolean; procedure work;
var
ans,sum,i,j,l,p:longint;
begin
ans:=;
for i:= to n do
begin
if (i=) or (x[i]<>x[i-]) then
begin
sum:=;
l:=;
for j:= to num do
k[j]:=;
for j:=i to n do
inc(k[z[j]]);
for j:= to n do
if vis[yi[j]]=false then
begin
p:=c+a*x[i]+b*y[yi[j]];
while (zi[l+]<=p)and(l<num) do
begin
inc(l);
inc(sum,k[l]);
end;
if ans<sum then ans:=sum;
if zi[l]>=a*x[yi[j]]+b*y[yi[j]] then dec(sum);
dec(k[z[yi[j]]]);
end;
end;
vis[i]:=true;
if i+ans>n then break;
end;
write(ans);
end; begin
init;
work;
end.
1071: [SCOI2007]组队 - BZOJ的更多相关文章
- BZOJ 1071 [SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1330 Solved: 417[Submit][Status][ ...
- 1071: [SCOI2007]组队
1071: [SCOI2007]组队 https://lydsy.com/JudgeOnline/problem.php?id=1071 分析: dp+单调性. A*(hi–minH)+B*(si–m ...
- BZOJ.1071.[SCOI2007]组队(思路)
题目链接 三个限制: \(Ah-AminH+Bv-BminV\leq C\ \to\ Ah+Bv\leq C+AminH+BminV\) \(v\geq minV\) \(h\geq minH\) 记 ...
- bzoj1071[SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2472 Solved: 792[Submit][Status][ ...
- 【BZOJ1071】[SCOI2007]组队(神仙题)
[BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...
- [SCOI2007]组队 差分
题面:[SCOI2007]组队 题解: 一开始固定H然后找性质找了很久也没有找到任何有用的东西...... 然后大佬告诉我一个神奇的方法... 首先我们化一波式子: 设$H$表示高度的最小值,$V$表 ...
- [BeiJing2010组队][BZOJ 1977]次小生成树 Tree
话说这个[BeiJing2010组队]是个什喵玩意? 这是一道严格次小生成树,而次小生成树的做法是层出不穷的 MATO IS NO.1 的博客里对两种算法都有很好的解释,值得拥有: (果然除我以外, ...
- 洛谷P4165 [SCOI2007]组队(排序 堆)
题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...
- 1070: [SCOI2007]修车 - BZOJ
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
随机推荐
- [转]C# 获取系统文件图标
//获取文件的图标 this.Icon = GetFileIcon(@"c:\gdiplus.dll"); //获取文件夹图标 this.Icon = GetDirectoryIc ...
- JMS - Exceptions
The JMSException JMS defines JMSException as the root class for exceptions thrown by JMS methods. JM ...
- Android之日历触屏测试
结构: 查看运行效果点这里 DiaryTest.apk下载 BaseCalendar: package com.cdp.Activity; import java.util.Calendar; imp ...
- (二)Qt界面设计之菜单栏
1.添加菜单项 直接输入菜单项名称,然后回车即可. 2.为菜单项设置图标 在动作编辑器上,右键选择编辑,然后添加图标 如果想在图标栏添加该菜单的快捷图标,直接将该动作项拖放只图标栏即可. 3.事件响应 ...
- Win32非递归遍历和搜索文件以及目录算法
转载请注明来源:http://www.cnblogs.com/xuesongshu 要点: 1.搜索的顶层目录在进入循环之前进栈 2.栈元素存储字符串指针,出栈时释放资源 3.每次循环开始,栈顶元素出 ...
- 用sublime编译C++的方法
sublime代码高亮这么好看,怎么能不用sublime敲代码呢: ) 本人用的版本是sublime Text3中文版 在网上查了查,自己的sublime现在也能编译C++了,设置步骤如下: 1.找到 ...
- Linux一
1,debian默认需要手动开启SSH连接# Authentication:LoginGraceTime 120PermitRootLogin without-passwordStrictModes ...
- vs2008 c++工程如何设置生成调试信息
记录一个使用vs2008碰到的问题: 今天在用vs2008的时候,想封装一个lib库,建了一个c++的lib工程,后来为了测试函数功能,想偷懒就直接在工程中加了个main函数,并且把工程属性prope ...
- windows下tomcat切割日志按照日期输出
windows下tomcat默认不会把应用的日志信息输出在日志文件中的,只会在控制台打印. 解决方法: 1,下载工具cronolog-1.6.1-win32.zip,并解压. 2,把cronolog. ...
- jquery ListBox 左右移动
<head runat="server"> <title>无标题页</title> <script type="text/jav ...