1071: [SCOI2007]组队
1071: [SCOI2007]组队
https://lydsy.com/JudgeOnline/problem.php?id=1071
分析:
dp+单调性。
A*(hi–minH)+B*(si–minV)<=C
Ahi+Bsi<=C+A*minH+B*minV
如果枚举一个minH,和一个minV的话,那么把数组按Ahi+Bsi排序后,这个数组就具有单调性了。
这里面的人不一定满足si>=minV和hi>=minH。先固定一个minV,然后把所有大于等于minV的取出来。这样满足了第一个限制。然后枚举minH的时候会由于minH的增加而导致小于了minH,可以把所有加入的放进小根堆里,然后不断弹出不合法的。这样复杂度是$n^2logn$在bzoj上过不了的(luogu上开O2可以过)
考虑枚举的时候先si>=minV,那么就有A*(hi-minH)<=C+B*minV-B*si,因为要hi>=minH,所0<=左式<=右式,所以C+B*minV-B*si>=0,得到si<=C/B+mv,注意这样还没有满足左式>=0的条件,但是目前si应该满足minV<=si<=C/B+minV。
这样依然没有满足左式>=0的条件。考虑减去这些不合法的。这里只需要按h从i小到大的扫描所有人,如果这个si是合法的,那么减去。
这样减是否会减到一些没有枚举过的?
就是枚举下面的序列的时候,是否枚举到上面的排列的后面去。
是不会的。
下面序列的满足,hi<=minH,si<=C/B+minV,所以A*hi+B*si最大是A*minH+B*minV+C,刚好到第一个序列的位置。
代码:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<iostream>
- #include<cmath>
- #include<cctype>
- #include<set>
- #include<queue>
- #include<vector>
- #include<map>
- using namespace std;
- typedef long long LL;
- inline int read() {
- int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
- for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
- }
- const int N = ;
- struct Node{
- int h, v; LL tot;
- }s[N], mv[N], mh[N];
- bool cmp1(const Node &A, const Node &B) {
- return A.tot < B.tot;
- }
- bool cmp2(const Node &A, const Node &B) {
- return A.h < B.h;
- }
- bool cmp3(const Node &A, const Node &B) {
- return A.v < B.v;
- }
- int main() {
- int n = read(); LL A = read(), B = read(), C = read();
- for (int i = ; i <= n; ++i) {
- s[i].h = read(), s[i].v = read(); s[i].tot = A * s[i].h + B * s[i].v;
- mv[i] = mh[i] = s[i];
- }
- sort(s + , s + n + , cmp1);
- sort(mh + , mh + n + , cmp2);
- sort(mv + , mv + n + , cmp3);
- int ans = ;
- for (int i = ; i <= n; ++i) {
- int p1 = , p2 = , cnt = ;
- LL minv = mv[i].v, limv = minv + C / B;
- for (int j = ; j <= n; ++j) {
- LL minh = mh[j].h, limtot = C + A * minh + B * minv;
- while (p1 <= n && s[p1].tot <= limtot) {
- if (s[p1].v >= minv && s[p1].v <= limv) cnt ++;
- p1 ++;
- }
- while (p2 <= n && mh[p2].h < minh) {
- if (mh[p2].v >= minv && mh[p2].v <= limv) cnt --;
- p2 ++;
- }
- ans = max(ans, cnt);
- }
- }
- cout << ans;
- return ;
- }
线性
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<iostream>
- #include<cmath>
- #include<cctype>
- #include<set>
- #include<queue>
- #include<vector>
- #include<map>
- using namespace std;
- typedef long long LL;
- inline int read() {
- int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
- for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
- }
- const int N = ;
- struct Node{
- int h, v; LL tot;
- }s[N], mv[N], mh[N];
- bool cmp1(const Node &A, const Node &B) {
- return A.tot < B.tot;
- }
- bool cmp2(const Node &A, const Node &B) {
- return A.h < B.h;
- }
- bool cmp3(const Node &A, const Node &B) {
- return A.v < B.v;
- }
- priority_queue<int, vector<int>, greater<int> > q;
- int main() {
- int n = read(); LL A = read(), B = read(), C = read();
- for (int i = ; i <= n; ++i) {
- s[i].h = read(), s[i].v = read(); s[i].tot = A * s[i].h + B * s[i].v;
- mv[i] = mh[i] = s[i];
- }
- sort(s + , s + n + , cmp1);
- sort(mh + , mh + n + , cmp2);
- sort(mv + , mv + n + , cmp3);
- int ans = ;
- for (int i = ; i <= n; ++i) {
- int p = , cnt = ;
- LL minv = mv[i].v;
- for (int j = ; j <= n; ++j) {
- LL minh = mh[j].h, limtot = C + A * minh + B * minv;
- while (p <= n && s[p].tot <= limtot) {
- if (s[p].v >= minv && s[p].h >= minh) cnt ++, q.push(s[p].h);
- p ++;
- }
- while (!q.empty() && q.top() < minh) cnt--, q.pop();
- ans = max(ans, cnt);
- }
- }
- cout << ans;
- return ;
- }
堆
1071: [SCOI2007]组队的更多相关文章
- BZOJ 1071 [SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1330 Solved: 417[Submit][Status][ ...
- 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]组队
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$表 ...
- BZOJ1071: [SCOI2007]组队【双指针】【思维好题】
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...
- [SCOI2007]组队
嘟嘟嘟 这题有人说部分分O(n3)暴力,然而我暴力都没写过,调了半天也没用……还是看题解吧 首先,咱把A * ( h – minH ) + B * ( s – minS ) <= C 变个型,得 ...
- 洛谷P4165 [SCOI2007]组队(排序 堆)
题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...
随机推荐
- JavaScript设计模式导学
如何成为一名合格的工程师? 作为一名合格的工程师,不仅需要懂代码,还要懂设计,一名合格工程师的必备条件: 前端开发有一定的设计能力,一般三年开发经验的同学,面试必须考设计能力 成为项目技术负责人,设计 ...
- [USACO09MAR]Look Up
嘟嘟嘟 题面说的有点问题,应该是向后看齐. 于是我们维护一个单调递减栈,如果当前a[i]比栈顶元素大,就执行pop操作,然后把pop出来的元素的答案都用 i 更新即可. #include<cst ...
- 【MySQL-123】MySQL8.0.12 安装于Win10
参考blog:MySQL8.0.12 安装及配置 [坑一]输入net start mysql时,MYSQL服务无法启动. 问题:第三步my.ini文件编码错误. 解决方案:https://blog.c ...
- MyBatis(1)-简单入门
简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...
- [Python WEB开发] 使用WSGI开发类Flask框架 (二)
WSGI Web服务器网关接口 WSGI主要规定了Web服务器如何与Web应用程序进行通信,以及如何将Web应用程序链接在一起来处理一个请求. wsgiref Python中的WSGI参考模块 ...
- AttributeError: 'module' object has no attribute get'
最近在写python requests相关内容易,突然报错AttributeError: 'module' object has no attribute 'get'" 脚本肯定没问题 怎么 ...
- 闲话缓存:ZFS 读缓存深入研究-ARC(一)
在Solaris ZFS 中实现的ARC(Adjustable Replacement Cache)读缓存淘汰算法真是很有意义的一块软件代码.它是基于IBM的Megiddo和Modha提出的ARC(A ...
- oracle定时器在项目中的应用
业务需求: 现在业务人员提出了一个需求: 在项目中的工作流,都要有一个流程编号,此编号有一定的规则: 前四五位是流程的字母缩写,中间是8位的日期,后面五位是流水码,要求流水码每天从00001开始.即: ...
- Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区(转载)
一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: 1 create table graderecord 2 ( 3 sno varchar2(10), 4 sname varcha ...
- iOS 数据安全、数据加密传输
近期接到一个新需求:APP企业版需要接入热更新功能. 热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击. 需要用到数据加密传输方面的知识,以下是我设计的加密解密流程: ...