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_ ...
随机推荐
- Django 发送html邮件
转载于: http://blog.sina.com.cn/s/blog_76e94d2101011bxd.html django中发送html邮件: #mailer.py # -*- co ...
- Linux磁盘管理.md
df df 即“可用磁盘”disk free,用于显示文件系统的磁盘使用情况.默认情况下 df 命令将以每块 1K 的单位进行显示所有当前已挂载的文件系统,如果你想以人类易读的格式显示 df 命令的输 ...
- 程序人生:02我来告诉你,一个草根程序员如何进入BAT
本文摘自左潇龙博客,原文出处:http://www.cnblogs.com/zuoxiaolong/p/life54.html 引言 首先声明,不要再问LZ谁是林萧,林萧就是某著名程序员小说的主角名字 ...
- session.upload_progress.enabled开启的问题
exp.php的内容,存在文件包含 <?php include($_GET['lfi']); $key = ini_get("session.upload_progress.prefi ...
- python——reuqests模块使用pip安装始终不成功
使用pip install xxx 来安装某一库. 使用 pip uninstall xxx 来卸载. 而pip 的也可以采用常见的两种安装方法 在centos系列下 使用sudo yum insta ...
- Python cx_oracle自动化操作oracle数据库增删改查封装,优化返回查询数据
# coding=utf-8 import cx_Oracle import os import json os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_C ...
- Lombok安装和使用
前言 Lombok是一个开源项目,其使用简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,特别是对于POJO. Lombok的官网:https://projectlombok ...
- nDPI的安装与测试
目录 简介 nDPI的环境依赖项安装 nDPI 安装 nDPI测试 官方Quick Start nDPI 的 github 简介 nDPI是一个开源的基于 OpenDPI 的 DPI 库,目前由 nt ...
- pl/sql下载
详解Oracle客户端工具:PL/SQL工具下载: 下载地址:http://www.oraclejsq.com/article/010100114.html
- 歌词解析&class
class song_song: def __init__(self,lrc_file): # 定义两个字典一个列表备用 self.song_file = lrc_file self.song_lrc ...