题目链接

大意

给定\(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\))

思路

对于给出的条件,简列一下就是:

\[\begin{cases}
①~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\),那么对于一个可以被选的点应满足

\[\begin{cases}
①Vi\ge Vmin\\
②Si\le C+A\cdot Hmin+B\cdot Vmin\\
\end{cases}\]

发现在\(Vmin\)值变大的时候,式子的右边都是单调递增的。

所以我们按照\(Vi\)排序,再枚举一个\(Vmin\)出来。


然后对于一个人,我们可以这样想,把它想成二维平面上的一个点\((Vi,Si)\)

那么就会有两个限制

\[\begin{cases}
①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】组队(单调性)的更多相关文章

  1. 1071: [SCOI2007]组队

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

  2. BZOJ 1071 [SCOI2007]组队

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

  3. bzoj1071[SCOI2007]组队

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

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

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

  5. [SCOI2007]组队 差分

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

  6. 1071: [SCOI2007]组队 - BZOJ

    Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...

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

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

  8. BZOJ1071: [SCOI2007]组队【双指针】【思维好题】

    Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...

  9. [SCOI2007]组队

    嘟嘟嘟 这题有人说部分分O(n3)暴力,然而我暴力都没写过,调了半天也没用……还是看题解吧 首先,咱把A * ( h – minH ) + B * ( s – minS ) <= C 变个型,得 ...

随机推荐

  1. spring boot 解决 跨域 的两种方法 -- 前后端分离

    1.前言 以前做项目 ,基本上是使用 MVC 模式 ,使得视图与模型绑定 ,前后端地址与端口都一样 , 但是现在有些需求 ,需要暴露给外网访问 ,那么这就出现了个跨域问题 ,与同源原则冲突, 造成访问 ...

  2. react中使用react-transition-group(CSSTransition)

    https://blog.csdn.net/sophie_u/article/details/80093876

  3. Spark词频前十的统计练习

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815390070254600712/ 承接上一个文档<Spark本地环境实现wordCount单词计数> ...

  4. 解读与部署(三):基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  5. Cache一致性协议与伪共享问题

    Cache一致性协议 在说伪共享问题之前,有必要聊一聊什么是Cache一致性协议 局部性原理 时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问 比如循环.方法的反复调用等 空间局 ...

  6. Amazon EKS 中 EFS 持久性存储

    作者:SRE运维博客 博客地址:https://www.cnsre.cn/ 文章地址:https://www.cnsre.cn/posts/220110850573/ 相关话题:https://www ...

  7. JAVA SOCKET 详解

    概述 本人在开发学习NETTY的过程中,需要了解很多的网络开发知识,在此我总结一些关于socket的基础知识,大部分是网络总结,在此篇的随笔中记录socket的知识,以便于记录,如有问题欢迎大家斧正. ...

  8. 【PTA】5-1 输入一个正整数n,再输入n个学生的姓名和百分制成绩,将其转换为两级制成绩后输出。

    5-1 输入一个正整数n,再输入n个学生的姓名和百分制成绩,将其转换为两级制成绩后输出.要求定义和调用函数set_grade(stu, n),其功能是根据结构数组stu中存放的学生的百分制成绩scor ...

  9. [MRCTF2020]Ezaudit

    [MRCTF2020]Ezaudit 知识点 1.源码泄露 2.伪随机数 3.sql注入? 题解 打开题目是个漂亮的前端,扫一下发现www.zip文件泄露,下载审计 <?php header(' ...

  10. [µC/GUI 学习]µC/GUI移植

    一.什么是µC/GUI µC/GUI为任何需要图形显示器的嵌入式应用提供了一种灵活的图形用户界面(GUI).µC/GUI允许软件工程师在使用了LCD显示器的产品上增加美轮美奂的用户界面,从简单的2D黑 ...