BZOJ1071: [SCOI2007]组队【双指针】【思维好题】
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在长整型以内。
思路
这题也真是够神仙的
首先把式子变成这样
$Ax+By-C\le Aminx + Bminy $
然后就重新取一个权值叫做\(val=Ax+By-C\)
把原数组复制两遍,一个按照x排序,一个按照val排序
然后我们先枚举miny,然后在内层枚举minx,但是同时怎么维护答案?
我们用一个指针扫val加入答案,并用一个指针扫x删除答案
我第一次看到的时候心情就是wtf?
确实很神奇
现在我们考虑加入答案的限制,首先y肯定是要大于等于miny的,但是y应该有一个上界,不然\(y-miny\)太大导致在满足\(val\le Aminx+Bminy\)的条件下\(x< minx\)
既然不能让x超界,也就是要满足\(minx\le x\),那么就一定有
\(By\le Bminy + C\)
也就是说\(miny\le y\le miny + \frac{C}{B}\)
这样就可以同时扫按照x排序的队列来把x不满足的都删掉了(因为y对于全局的限制都是相等的)
???
好像推不过来吧,不过没事,在这道题里面是对的
现在来考虑另一个事情:会不会有没有统计贡献的被删除贡献?
不可能的
被删除贡献的时候需要满足\(x<minx\)和\(min\le y\le miny+\frac{C}{B}\)
显然是满足\(Ax+By\le Aminx+Bminy+C\)的
那不就一定会在上面统计贡献吗?
所以就成立了。。。然后其实你也可以根据刚刚这个式子把\(By\le Bminy + C\)理解为让删除不重不漏的条件
#include<bits/stdc++.h>
using namespace std;
const int N = 5010;
int n, A, B, C;
int ans;
struct Point {
int x, y, val;
Point() {}
Point(int x, int y, int val): x(x), y(y), val(val) {}
} p[N], q[N];
bool cmp1(const Point a, const Point b) {
return a.x < b.x;
}
bool cmp2(const Point a, const Point b) {
return a.val < b.val;
}
int main() {
scanf("%d %d %d %d", &n, &A, &B, &C);
for (int i = 1; i <= n; i++) {
int x, y;
scanf("%d %d", &x, &y);
p[i] = q[i] = Point(x, y, A * x + B * y - C);
}
sort(p + 1, p + n + 1, cmp1);
sort(q + 1, q + n + 1, cmp2);
for (int i = 1; i <= n; i++) {
int tp = 0, tq = 0, cur = 0;
int dn = p[i].y, up = C / B + p[i].y;
for (int j = 1; j <= n; j++) {
int limit = A * p[j].x + B * p[i].y;
while (tp < n && p[tp + 1].x < p[j].x) {
++tp;
cur -= dn <= p[tp].y && p[tp].y <= up;
}
while (tq < n && q[tq + 1].val <= limit) {
++tq;
cur += dn <= q[tq].y && q[tq].y <= up;
}
ans = max(ans, cur);
}
}
printf("%d", ans);
return 0;
}
BZOJ1071: [SCOI2007]组队【双指针】【思维好题】的更多相关文章
- 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\) 我们正常能够想到的做法是钦定 ...
- BZOJ 1071 [SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1330 Solved: 417[Submit][Status][ ...
- [SCOI2007]组队 差分
题面:[SCOI2007]组队 题解: 一开始固定H然后找性质找了很久也没有找到任何有用的东西...... 然后大佬告诉我一个神奇的方法... 首先我们化一波式子: 设$H$表示高度的最小值,$V$表 ...
- 1071: [SCOI2007]组队
1071: [SCOI2007]组队 https://lydsy.com/JudgeOnline/problem.php?id=1071 分析: dp+单调性. A*(hi–minH)+B*(si–m ...
- [Gym101982M][思维好题][凸壳]Mobilization
[gym101982M][思维好题][凸壳]Mobilization 题目链接 20182019-acmicpc-pacific-northwest-regional-contest-div-1-en ...
- 土题大战Vol.0 A. 笨小猴 思维好题
土题大战Vol.0 A. 笨小猴 思维好题 题目描述 驴蛋蛋有 \(2n + 1\) 张 \(4\) 星武器卡片,每张卡片上都有两个数字,第 \(i\) 张卡片上的两个数字分别是 \(A_i\) 与 ...
- 【bzoj1071】[SCOI2007]组队
sum= A*h+B*s排序 然后枚举height和speed的最小值 然后用两个指针:先枚举speed最小值,然后一边枚举v的最小值一边查询符合条件的人数. #include<algorith ...
- BZOJ1071 [SCOI2007]压缩 其他
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1071 题意概括 有两个序列a[1..n], b[1..n],其编号为1..n,设为s序列.现在我们 ...
随机推荐
- jq的attr()与prop()之间区别
1.attr() 一直存在,prop() 仅存在于 jq-1.6 及其之后 2.新版本jq使用细节: 2.1 自定义添加至dom节点的属性,用attr获取 2.2 表单类checked.selecte ...
- 禁用表单元素 && 禁止选中
一.禁用表单元素 1.dom设置属性 disabled="disabled" || disabled=true 2.css样式(高版本浏览器) pointer-events:non ...
- webpack4试水总结
看了官方的升级通告,据说webpack4的打包效率提升近一倍,于是最近在项目分支上升级了下webpack4,过程中的一些报错及问题简单整理下,以供交流. 在之前的旧项目上单纯的升级webpack版本后 ...
- Isotig & cDNA & gene structure & alternative splicing & gene loci & 表达谱
参考:高通量测序相关名词 Isotig 指在转录组de novo测序时,用454平台测序完成后组装出的结果,一个isotig可视为一个转录本. Isogroup 指转录组de novo测序中,用454 ...
- 20170728xlVba SSC_TODAY
Public Sub SSC_TODAY() Dim strText As String Dim Reg As Object, Mh As Object, OneMh As Object Dim i ...
- laravel 异常深度解析
一.前言 做一件事,不仅要知其然,更要知其所以然.大部分的人都生活在别人设计的世界里,不是没有能力去更深一层,更进一步,而是因为自己懒得去思考.也许自己现在要做的就是:不要让自己舒服吧. 二.正题 1 ...
- h1042 N!大数乘int
计算10000以内某个数的阶乘,即大数乘以int,考虑到一个int存一个数位过于繁琐且浪费空间,采用万进制 一个int存四个位数,但注意除了最高位,其他位不够四位数时要加上前导0凑够四位: 例1234 ...
- Linux系统中切换用户身份su与sudo的用法与实例
日常操作中为了避免一些误操作,更加安全地管理系统,通常使用的用户身份都为普通用户,而非root.当需要执行一些管理员命令操作时,再切换成root用户身份去执行. 普通用户切换到root用户的方式有:s ...
- MVC 模式——第3章
在深入到 ASP.NET MVC 框架的细节之间,最好熟悉 MVC 的设计模式及其背后的思想.良好地理解 MVC 背后的内容,有助于在阅读本书的过程中将该框架的特性放到相关的情境之中. 3.2 理解 ...
- win7下android开发环境搭建(win7 64位)
win7下android开发环境搭建(win7 64位) 一.安装 JDK 下载JDK最新版本,下载地址如下: http://www.oracle.com/technetwork/java/jav ...