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]组队的更多相关文章

  1. BZOJ 1071 [SCOI2007]组队

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

  2. 1071: [SCOI2007]组队 - BZOJ

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

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

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

  4. bzoj1071[SCOI2007]组队

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

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

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

  6. [SCOI2007]组队 差分

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

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

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

  8. [SCOI2007]组队

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

  9. 洛谷P4165 [SCOI2007]组队(排序 堆)

    题意 题目链接 Sol 跟我一起大喊:n方过百万,暴力踩标算! 一个很显然的思路是枚举\(H, S\)的最小值算,复杂度\(O(n^3)\) 我们可以把式子整理一下,变成 \[A H_i + B S_ ...

随机推荐

  1. 【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  2. python各种模块的使用

    Pexpect模块:http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/ ConfigParser模块:http://blog.china ...

  3. luogu P1272 重建道路

    嘟嘟嘟 这好像是一种树上背包. 我们令dp[i][j] 表示在 i 所在的子树中(包括节点 i)分离出一个大小为 j 的子树最少需割多少条边. 那么转移方程就是 dp[u][j] = min(dp[u ...

  4. 【PHP】 mysqli_autocommit() 函数

    //获取每一篇文章的内容 function getPost($f_parent_id, $f_title, $f_username, $f_board_id,$f_post_time, $f_ip,$ ...

  5. 6、Spring Cloud -熔断器Hystrix

    6.1.什么是Hystrix 在分布式系统中.服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务 出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞.   Hystrix是Netfli ...

  6. jquery mobile各类标签的refresh

    JQM里面当我们更新了某些页面标签(如: listview, radiobuttons, checkboxes, select menus)里的数据时,必须做refresh操作. 为什么必须做refr ...

  7. 提交json串格式的POST请求

    提交json串格式的POST请求 Action() { web_reg_save_param("retCode", "LB=retCode\":\"& ...

  8. SQL 语句 merge into

    MERGE INTO tb_st_shxxcount tt USING ( SELECT DISTINCT sd.CODE, COUNT (ts.LRDW) count1, TO_CHAR (ts.L ...

  9. vlc源码分析(二) 播放流程

    当点击播放文件或者输入要播放的文件后,vlc会执行一系列的流程. 首先需要了解视频以及流媒体处理及播放的流程,由链接中的描述,视频以及流媒体处理时,首先要解协议(http,rtmp,rtsp等),然后 ...

  10. 阅读基于sketch的软件定义网络测量数据平面硬件模型

    概要 硬件实现 基于sketch 功能:采集包数.流长数据,恢复五元组 重点:高速条件下性能较好,节省硬件资源 摘要: 提出一种基于sketch 数据结构的软件定义测量数据平面硬件模型,并在以现场可编 ...