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_ ...
随机推荐
- flume MemoryChannel 源代码解析
1.先分析三个LinkedBlockingDeque<Event>类型的takeList,putList,queue putList: 存放的是来自source生产的数据,通过调用doP ...
- 【jQuery】动画小练习
1.jQuery部分代码如下 <script type="text/javascript"> $(function(){ var page = 1; var i = 4 ...
- MVC5新特性(一)之RouteAttribute打造自己的URL规则
1.RouteAttribute概述 RouteAttribute的命名空间是System.Web.Mvc,区别与web api的RouteAttribute(它的命名空间是System.Web.Ht ...
- array详解
array和vector大致是相同的,区别在于array的大小是固定的.不能增加和缩小.另外array的swap()函数和vector的swap()函数在算法复杂度上是有区别的,array.swap( ...
- Jenkins Gitlab持续集成打包平台搭建
http://www.cnblogs.com/skyseraph/p/5695021.html 1. 相关概念 Jenkins Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的 ...
- 查看mysql的安装目录
如果忘记了MySQL的安装目录,怎么快速找到呢?方法或许很多,作者觉得这种最方便了 环境:windows+mysql+navicat 方法:进入mysql命令行输入:show variables li ...
- Notes 20180509 : Java基本数据类型
计算机就是个机器,这个机器由CPU.内存.硬盘和输入输出设备组成.计算机上运行着操作系统,操作系统提供对外的接口供各厂商和开发语言,开发运行在其上的驱动和应用程序. 操作系统将时间分成细小的时间碎片, ...
- 设置PL/SQL Developer 字符集
本文转自:http://blog.itpub.net/26613085/viewspace-765429/ 适用于:客户端和服务端不一致的情况,或者客户端某个字段的值乱码
- vue+element 点击按钮后 导致 刷新页面 致url中拼接 ? 或者拼接参数
https://blog.csdn.net/sinat_37255207/article/details/88917162 element 自己的<el-form></el-form ...
- 1004. Counting Leaves(30)—PAT 甲级
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family member ...