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无数

  1. const
  2. maxn=;
  3. type
  4. aa=array[..maxn]of longint;
  5. var
  6. n,num,a,b,c:longint;
  7. x,y,z,k,yi,zi:aa;
  8.  
  9. procedure swap(var x,y:longint);
  10. var
  11. t:longint;
  12. begin
  13. t:=x;x:=y;y:=t;
  14. end;
  15.  
  16. procedure sort(l,r:longint;var a,b:aa);
  17. var
  18. i,j,y:longint;
  19. begin
  20. i:=l;
  21. j:=r;
  22. y:=a[(l+r)>>];
  23. repeat
  24. while a[i]<y do
  25. inc(i);
  26. while a[j]>y do
  27. dec(j);
  28. if i<=j then
  29. begin
  30. swap(a[i],a[j]);
  31. swap(b[i],b[j]);
  32. inc(i);
  33. dec(j);
  34. end;
  35. until i>j;
  36. if i<r then sort(i,r,a,b);
  37. if j>l then sort(l,j,a,b);
  38. end;
  39.  
  40. procedure init;
  41. var
  42. i:longint;
  43. begin
  44. read(n,a,b,c);
  45. for i:= to n do
  46. read(x[i],y[i]);
  47. sort(,n,x,y);
  48. for i:= to n do
  49. begin
  50. k[i]:=y[i];
  51. yi[i]:=i;
  52. end;
  53. sort(,n,k,yi);
  54. for i:= to n do
  55. begin
  56. k[i]:=i;
  57. zi[i]:=a*x[i]+b*y[i];
  58. end;
  59. sort(,n,zi,k);
  60. for i:= to n do
  61. if (zi[i]=zi[i-]) and (i<>) then z[k[i]]:=z[k[i-]]
  62. else z[k[i]]:=z[k[i-]]+;
  63. num:=;
  64. for i:= to n do
  65. if zi[i]<>zi[i-] then
  66. begin
  67. inc(num);
  68. zi[num]:=zi[i];
  69. end;
  70. end;
  71.  
  72. var
  73. vis:array[..maxn]of boolean;
  74.  
  75. procedure work;
  76. var
  77. ans,sum,i,j,l,p:longint;
  78. begin
  79. ans:=;
  80. for i:= to n do
  81. begin
  82. if (i=) or (x[i]<>x[i-]) then
  83. begin
  84. sum:=;
  85. l:=;
  86. for j:= to num do
  87. k[j]:=;
  88. for j:=i to n do
  89. inc(k[z[j]]);
  90. for j:= to n do
  91. if vis[yi[j]]=false then
  92. begin
  93. p:=c+a*x[i]+b*y[yi[j]];
  94. while (zi[l+]<=p)and(l<num) do
  95. begin
  96. inc(l);
  97. inc(sum,k[l]);
  98. end;
  99. if ans<sum then ans:=sum;
  100. if zi[l]>=a*x[yi[j]]+b*y[yi[j]] then dec(sum);
  101. dec(k[z[yi[j]]]);
  102. end;
  103. end;
  104. vis[i]:=true;
  105. if i+ans>n then break;
  106. end;
  107. write(ans);
  108. end;
  109.  
  110. begin
  111. init;
  112. work;
  113. end.

1071: [SCOI2007]组队 - BZOJ的更多相关文章

  1. BZOJ 1071 [SCOI2007]组队

    1071: [SCOI2007]组队 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1330  Solved: 417[Submit][Status][ ...

  2. 1071: [SCOI2007]组队

    1071: [SCOI2007]组队 https://lydsy.com/JudgeOnline/problem.php?id=1071 分析: dp+单调性. A*(hi–minH)+B*(si–m ...

  3. BZOJ.1071.[SCOI2007]组队(思路)

    题目链接 三个限制: \(Ah-AminH+Bv-BminV\leq C\ \to\ Ah+Bv\leq C+AminH+BminV\) \(v\geq minV\) \(h\geq minH\) 记 ...

  4. bzoj1071[SCOI2007]组队

    1071: [SCOI2007]组队 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2472  Solved: 792[Submit][Status][ ...

  5. 【BZOJ1071】[SCOI2007]组队(神仙题)

    [BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...

  6. [SCOI2007]组队 差分

    题面:[SCOI2007]组队 题解: 一开始固定H然后找性质找了很久也没有找到任何有用的东西...... 然后大佬告诉我一个神奇的方法... 首先我们化一波式子: 设$H$表示高度的最小值,$V$表 ...

  7. [BeiJing2010组队][BZOJ 1977]次小生成树 Tree

    话说这个[BeiJing2010组队]是个什喵玩意? 这是一道严格次小生成树,而次小生成树的做法是层出不穷的 MATO IS NO.1 的博客里对两种算法都有很好的解释,值得拥有:  (果然除我以外, ...

  8. 洛谷P4165 [SCOI2007]组队(排序 堆)

    题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...

  9. 1070: [SCOI2007]修车 - BZOJ

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

随机推荐

  1. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

  2. oracle11g 创建用户并授权

    Oracle创建用户并给用户授权查询指定表或视图的权限用sys账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAUL ...

  3. 【转载】干货再次来袭!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载八)用命令实现批量添加用户

    Windows添加用户需要至少5个界面,而Linux一条命令就搞定了,这是不是高效人士办公第一法则呢.本文不给你一堆参数和选项,不让你见识教条主义,只给你最实用的代码. 想每天能听到小妞的语音播报,想 ...

  4. 限制SSH访问源,禁止4A之外的地址跳转访问

    [fuel节点] 在/etc/hosts.allow文件中添加: sshd:10.129.0.1:allow sshd:10.129.0.2:allow sshd:10.129.0.3:allow s ...

  5. spring aop配置及用例说明(3)

    欢迎转载交流:http://www.cnblogs.com/shizhongtao/p/3476336.html 1.这里说一下aop的@Around标签,它提供了在方法开始和结束,都能添加用户业务逻 ...

  6. GDI+

    1, 编译error的话一般是却 #include <comdef.h>#include <Windows.h> Windows.h内会包含Windows.h,但是因为在std ...

  7. lex&yacc6 ---error

    类的检测 http://blog.csdn.net/pandaxcl/article/details/1536784

  8. Qt自定义菜单项

    经常会看到一些菜单的部分项是由几个按钮组成的,如酷狗.QQ.360都有类似菜单,对于常规的菜单项,图标 + 文字 实现一个事件,很容易完成,那么怎么自定义菜单项呢? Qt提供了支持,就是利用QWidg ...

  9. jquery实现全选、全不选、反选操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  10. 多线程的单元测试工具 - GroboUtils

    写过Junit单元测试的同学应该会有感觉,Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit退出用例执行的.JVM都终止了,在测试线程启动的其他线程自 ...