【SCOI2007】组队(单调性)
大意
给定\(N\)个人与三个常量\(A,B,C\),每个人有两个属性:\(Hi\),\(Vi\).
现要让你选些人出来,定义\(Hmin\)为选出来的这些人中最小的\(Hi\)值,\(Vmin\)同理.
对于选出来的这些人,每个人都要满足$$A\cdot Hi+B\cdot Vi\le A\cdot Hmin+B\cdot Vmin+C$$
求最多能选出多少人。
(满足\(N\le 5000\))
思路
对于给出的条件,简列一下就是:
①~A\cdot Hi+B\cdot Vi\le A\cdot Hmin+B\cdot Vmin+C\\
②~Hi\ge Hmin\\
③~Vi\ge Vmin\\
\end{cases}\]
首先,易得一个\(O(N^3)\)的算法:暴力枚举\(Hmin,Vmin\),再对每个人,看是否满足以上条件。
考虑优化:
首先观察数据范围,发现支持\(O(N^2)\)的做法。
那么先随便枚举一个\(Hmin\)出来(以下推导均已满足\(Hmin\le Hi\))。
考虑在枚举\(Vmin\)时,如何统计:
我们设\(Si=A\cdot Hi+B\cdot Vi\),那么对于一个可以被选的点应满足
①Vi\ge Vmin\\
②Si\le C+A\cdot Hmin+B\cdot Vmin\\
\end{cases}\]
发现在\(Vmin\)值变大的时候,式子的右边都是单调递增的。
所以我们按照\(Vi\)排序,再枚举一个\(Vmin\)出来。
然后对于一个人,我们可以这样想,把它想成二维平面上的一个点\((Vi,Si)\)
那么就会有两个限制
①Vi\ge Vmin\\
②Si\le C+A\cdot Hmin+B\cdot Vmin\\
\end{cases}\]
设有两条直线:$$L1:X=Vmin$$$$L2:Y=C+A\cdot Hmin+B\cdot Vmin$$
那么在\(Vmin\)值变大的时候,\(L1\)右移,\(L2\)上移,如图:

那么对应的,\(L1\)经过的点的\(Vi\)肯定都小于当前的\(Vmin\),故\(L1\)经过的都不合法。
而当前合法的点肯定会被\(L2\)经过。(包含当前\(L2\)上点)
所以,我们就可以在\(Vmin\)增大时,用什么Vis数组之类的动态维护答案,不断取Max值就行了。
代码
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define LL long long
const int MAXN=5005;
const int MAXV=10000;
int N,Ans,Vis[MAXN];
long long A,B,C;
struct Node{int H,V,id;LL S;};
Node s1[MAXN],s2[MAXN],s3[MAXN];
bool cmpH(Node X,Node Y){return X.H<Y.H;}
bool cmpV(Node X,Node Y){return X.V<Y.V;}
bool cmpS(Node X,Node Y){return X.S<Y.S;}
int main(){
//freopen("team.in","r",stdin);
//freopen("team.out","w",stdout);
scanf("%d%lld%lld%lld",&N,&A,&B,&C);
for(int i=1;i<=N;i++){
scanf("%d%d",&s1[i].H,&s1[i].V);
s1[i].S=s1[i].H*A+s1[i].V*B;s1[i].id=i;
s2[i]=s3[i]=s1[i];
}
sort(s2+1,s2+N+1,cmpV);
sort(s3+1,s3+N+1,cmpS);
for(int i=1;i<=N;i++){
int Hmin=s1[i].H;
int p1=1,p2=1,cnt=0;
for(int j=1;j<=N;j++)Vis[j]=0;
for(int j=1;j<=N;j++){
int Vmin=s2[j].V;
for(;p1<=N&&s3[p1].S<=C+Hmin*A+Vmin*B;p1++)
if(s3[p1].H>=Hmin)cnt+=(Vis[s3[p1].id]==0),Vis[s3[p1].id]=1;
for(;p2<=N&&s2[p2].V<Vmin;p2++)
if(s2[p2].H>=Hmin)cnt-=Vis[s2[p2].id],Vis[s2[p2].id]=1;
Ans=max(Ans,cnt);
}
}
printf("%d\n",Ans);
}
/*
H*A+V*B<=C+Hmin*A+Vmin*B
H>=Hmin V>=Vmin
*/
【SCOI2007】组队(单调性)的更多相关文章
- 1071: [SCOI2007]组队
1071: [SCOI2007]组队 https://lydsy.com/JudgeOnline/problem.php?id=1071 分析: dp+单调性. A*(hi–minH)+B*(si–m ...
- BZOJ 1071 [SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1330 Solved: 417[Submit][Status][ ...
- 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$表 ...
- 1071: [SCOI2007]组队 - BZOJ
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...
- BZOJ.1071.[SCOI2007]组队(思路)
题目链接 三个限制: \(Ah-AminH+Bv-BminV\leq C\ \to\ Ah+Bv\leq C+AminH+BminV\) \(v\geq minV\) \(h\geq minH\) 记 ...
- BZOJ1071: [SCOI2007]组队【双指针】【思维好题】
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...
- [SCOI2007]组队
嘟嘟嘟 这题有人说部分分O(n3)暴力,然而我暴力都没写过,调了半天也没用……还是看题解吧 首先,咱把A * ( h – minH ) + B * ( s – minS ) <= C 变个型,得 ...
随机推荐
- K210,yolo,face_mask口罩检测模型训练及其在K210,kd233上部署
前段时间考研,再加上工作,时间很紧,一直没有更新博客,这几天在搞k210的目标检测模型,做个记录,遇到问题可以添加qq522414928或添加微信13473465975,共同学习 首先附上github ...
- HDU 1106 (1.3.5) 排序 (C语言描述)
排序 Problem Description 输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非 ...
- 服务监控 | 彻底搞懂Dropwizard Metrics一篇就够了
Metrics是一个提供服务性能检测工具的Java类库,它提供了功能强大的性能指标工具库用于度量生产环境中的各关键组件性能. 度量类型 Metrics提供了以下几种基本的度量类型: Gauge:用于提 ...
- CTF-sql-sql约束注入
create table user( id int not null auto_increment, username varchar(30) not null, password varchar(3 ...
- Git 基本操作指南
Git 基本操作指南 内容概要 这个作业属于哪个课程 2022面向对象程序设计 这个作业要求在哪里 2022面向对象程序设计寒假作业1 这个作业的目标 Git & Github 作业正文 如下 ...
- Vue 动态设置图片路径
大多数情况vue项目中组件是需要相互引用的,父组件引用子组件,子组件引用父组件,已达到组件重用的目的 本次记录的是父组件引用子组件,img标签定义在多个子组件中,不同或相同的父组件引用同一个子 ...
- 《剑指offer》面试题37. 序列化二叉树
问题描述 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]&quo ...
- webstorm 配置git代码项目管理工具
1.下载最新的webStrom11安装包安装 https://confluence.jetbrains.com/display/WI/Previous+WebStorm+Releases/ 2.破解w ...
- RBAC: K8s基于角色的权限控制
文章目录 RBAC: K8s基于角色的权限控制 ServiceAccount.Role.RoleBinding Step 1:创建一个ServiceAccount,指定namespace Step 2 ...
- Sentry 开发者贡献指南 - 测试技巧
作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...