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_ ...
随机推荐
- 【[CQOI2018]交错序列】
这个题简直有毒,\(O((a+b)^3logn)\)的做法不卡常只比\(O(2^n*n)\)多\(10\)分 看到\(a\)和\(b\)简直小的可怜,于是可以往矩阵上联想 发现这个柿子有些特殊,好像可 ...
- Hadoop学习之路(二十八)MapReduce的API使用(五)
求所有两两用户之间的共同好友 数据格式 A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D, ...
- 【PHP】 mysqli_autocommit() 函数
//获取每一篇文章的内容 function getPost($f_parent_id, $f_title, $f_username, $f_board_id,$f_post_time, $f_ip,$ ...
- 【Vue.js】高仿饿了么外卖App(一)
1.架构从传统的MVC向REST API+前端MV*迁移 参考链接: http://blog.csdn.net/broadview2006/article/details/8615055 http:/ ...
- ROS C++ 规范概要
一.动机 代码一致才能可读.联调.高效率.高复用.可移植性. 二.命名方式 CamelCased camelCased under_scored ALL_CAPITALS 2.1 Package命名方 ...
- Mysql数据库写入数据速度优化
Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1:设置为0,可以提高写入速度. 值为0:提升写入速度,但是安全方面较差,mysql服务器 ...
- PPP interface for lwIP
//原文 地址 :http://www.nongnu.org/lwip/2_0_x/group__ppp.html /* //协议说明,2017年6月29日14:19:18,suozhang PPP ...
- redis集群环境搭建的错误
安装redis集群需要版本号在3.0以上 redis-cluster安装前需要安装ruby环境 搭建集群需要使用到官方提供的ruby脚本. 需要安装ruby的环境. yum -y install ru ...
- 1<=portNo<=4竟然在keil4.71里面不报错
1.if( 1<=portNo<=4 ) { CardIn2_CS_L; //pull low CardIn1_CS_H; CardOut1_CS_H; CardOut2_CS_H ...
- PlanetLab介绍
转自http://blog.sina.com.cn/s/blog_83517c050100vyzq.html PlanetLab产生背景 随着计算机技术和通信技术的不断发展,Internet的商业化和 ...