一道比较NB的套路题。

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

  1 <= N <= 5000,0<= height,speed <= 10000,A、B、C在长整型以内且为正数。

Solution

  最暴力的O(n^3)做法就是枚举minH和minV,加入满足条件的点即可。

  我们试着优化一下:

  一看到n=5000,肯定是n^2的做法,因此我们有枚举minH和minV其中一个的余地,所以还是枚举minV,把speed[i]<minV的点去除。

  然后我们把式子转化一下:

    

    

    

  由于我们枚举了minV,所以minV可以看做是一个常数,设C'=C+B*minV。

    

  这就很有意思,我们设X[i]=height[i],Y[i]=A*height[i]+B*speed[i]。于是每个运动员就对应平面直角坐标系中的点(X[i],Y[i])。

  当我们枚举minH的时候,就相当于在问有多少个点(X[i],Y[i])满足:

    ,这就是一个二维数点问题。

  把这些点按照X[i]排序从大到小加点,用(离散化加上)树状数组维护Y[i],就可以得到一个O(n^2logn)的做法。

  虽然时间复杂度爆炸但是小C才不会告诉你小C用这个做法过了该题。

  但是我们注意到随着minH的减小,A*minH+C'也是不断减小的,(A>0,虽然原题没说但是就算A为负数也是同理的做法)。

  所以我们把这些点不仅按X[i]排序,还要按Y[i]排序,用两个指针维护,按X[i]从大到小加点,并按Y[i]从大到小删点。

  再加上我们对这些点使用排序时用上插入排序,就可以得到一个O(n^2)的做法。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define MN 5003
using namespace std;
struct meg{int x,z; ll y;}a[MN];
int c1[MN],c2[MN];
bool u[MN];
int n,A,B,C,ans,tp1,tp2; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} void solve(ll CX)
{
register int i,j,k,sum=;
ll lt;
for (i=tp1,k=tp2;i;i=j)
{
lt=1LL*A*a[c1[i]].x+CX;
for (j=i;j&&a[c1[j]].x==a[c1[i]].x;--j)
if (a[c1[j]].y<=lt) ++sum,u[c1[j]]=true;
for (;k&&a[c2[k]].y>lt;--k)
if (u[c2[k]]) --sum,u[c2[k]]=false;
ans=max(ans,sum);
}
for (;k;--k) if (u[c2[k]]) u[c2[k]]=false;
} void isort1(int ax)
{
register int i,j;
for (i=;i<=tp1;++i)
if (a[ax].x<a[c1[i]].x) break;
++tp1;
for (j=tp1;j>i;--j) c1[j]=c1[j-];
c1[i]=ax;
}
void isort2(int ax)
{
register int i,j;
for (i=;i<=tp2;++i)
if (a[ax].y<a[c2[i]].y) break;
++tp2;
for (j=tp2;j>i;--j) c2[j]=c2[j-];
c2[i]=ax;
}
bool cmp1(const meg& a,const meg& b) {return a.z<b.z;} int main()
{
register int i,j;
n=read(); A=read(); B=read(); C=read();
for (i=;i<=n;++i)
{
a[i].x=read(); a[i].z=read();
a[i].y=1LL*a[i].x*A+1LL*a[i].z*B;
}
sort(a+,a+n+,cmp1);
for (i=n;i;i=j)
{
for (j=i;j&&a[j].z==a[i].z;--j)
isort1(j),isort2(j);
solve(1LL*a[i].z*B+C);
}
printf("%d",ans);
}

Last Word

  小C的O(n^2logn)做法(BZOJ上总时限为3s):

  O(n^2)做法(对比):

  常数小就是舒服.jpg

[BZOJ]1071 组队(SCOI2007)的更多相关文章

  1. BZOJ 1071组队

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1071 题目很好,居然写了很久,题解找了真多: 主要两种做法: O(n^2lgn),通过优先 ...

  2. BZOJ 1071 [SCOI2007]组队

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

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

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

  4. 【BZOJ】1070: [SCOI2007]修车

    1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...

  5. BZOJ 1066 【SCOI2007】 蜥蜴

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为$1$,蜥蜴的跳跃距离是d,即蜥蜴可以跳 ...

  6. 【BZOJ】1074: [SCOI2007]折纸origami

    http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n ...

  7. 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...

  8. 【BZOJ】1070: [SCOI2007]修车(费用流+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 好神的题!!!orz 首先我是sb不会拆点..... 首先,每一个技术人员维修车辆都有一个先后 ...

  9. 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1067 好不爽,弄了一个晚上. 好不爽. 还是照着别人程序拍着看的!!! 噗 这题很变态. 首先,我没 ...

随机推荐

  1. QTableView

    QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: 一 添加表头 //准备数据模型     QStandardItemModel *student_model = ne ...

  2. 利用python实现简单邮件功能

    #!/usr/bin/env python # -*- coding:utf-8 -*- import smtplib from email.utils import formataddr from ...

  3. Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享

    本案例中发生故障的存储类型是HP P2000,虚拟化平台为vmware exsi,共有10块硬盘组成raid5(硬盘容量为1t,其中6号盘是热备盘),由于某些故障导致阵列中两块硬盘亮黄灯掉线,硬盘无法 ...

  4. GitChat招募IT类写作作者

    GitChat是一个移动端的IT知识.技术分享平台,于2017.10和CSDN合并,成为其旗下独立品牌. 我们正在寻求有互联网基因的人来一起分享IT人员的关切,诚挚邀请您来做一次分享(让IT类文章变现 ...

  5. 开发者的如何优雅的使用OSX

    Mac对于IT开发者来说是最好的开发工具,没有之一. 但是对于大部分人来说,第一个接触的PC操作系统都是Windows系统,此文将带大家优雅的快速学习和使用Mac的OSX系统. 1. 从键盘说起 Ma ...

  6. Angular组件——组件生命周期(二)

    一.view钩子 view钩子有2个,ngAfterViewInit和ngAfterViewChecked钩子. 1.实现ngAfterViewInit和ngAfterViewChecked钩子时注意 ...

  7. Spring中获取request的几种方法,及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  8. Python之日志 logging模块

    关于logging模块的日志功能 典型的日志记录的步骤是这样的: 创建logger 创建handler 定义formatter 给handler添加formatter 给logger添加handler ...

  9. ajax实现跨域访问的两种方式

    一.使用jsonp实现跨域请求 在前端开发这中你会发现,所有带src属性的标签都可以跨域访问其他服务器文件.jsonp实现的原理也是如此. 以jsonp的数据类型进行请求时,JQ会动态在页面中添加sc ...

  10. JS-DOM ~ 03. 子节点的操作、style.样式和属性、dom元素的创建方法及操作、14个例题、主要是利用js直接控制html属性

    带有Element和不带的区别 a)  带Element的获取的是元素节点 b)  不带可能获取文本节点和属性节点 获取所以子节点 a)   . childNodes b)   . children ...