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,刚好到第一个序列的位置。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<cctype>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #include<map>
  11. using namespace std;
  12. typedef long long LL;
  13.  
  14. inline int read() {
  15. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  16. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  17. }
  18.  
  19. const int N = ;
  20.  
  21. struct Node{
  22. int h, v; LL tot;
  23. }s[N], mv[N], mh[N];
  24.  
  25. bool cmp1(const Node &A, const Node &B) {
  26. return A.tot < B.tot;
  27. }
  28. bool cmp2(const Node &A, const Node &B) {
  29. return A.h < B.h;
  30. }
  31. bool cmp3(const Node &A, const Node &B) {
  32. return A.v < B.v;
  33. }
  34.  
  35. int main() {
  36. int n = read(); LL A = read(), B = read(), C = read();
  37. for (int i = ; i <= n; ++i) {
  38. s[i].h = read(), s[i].v = read(); s[i].tot = A * s[i].h + B * s[i].v;
  39. mv[i] = mh[i] = s[i];
  40. }
  41. sort(s + , s + n + , cmp1);
  42. sort(mh + , mh + n + , cmp2);
  43. sort(mv + , mv + n + , cmp3);
  44.  
  45. int ans = ;
  46. for (int i = ; i <= n; ++i) {
  47. int p1 = , p2 = , cnt = ;
  48. LL minv = mv[i].v, limv = minv + C / B;
  49. for (int j = ; j <= n; ++j) {
  50. LL minh = mh[j].h, limtot = C + A * minh + B * minv;
  51. while (p1 <= n && s[p1].tot <= limtot) {
  52. if (s[p1].v >= minv && s[p1].v <= limv) cnt ++;
  53. p1 ++;
  54. }
  55. while (p2 <= n && mh[p2].h < minh) {
  56. if (mh[p2].v >= minv && mh[p2].v <= limv) cnt --;
  57. p2 ++;
  58. }
  59. ans = max(ans, cnt);
  60. }
  61. }
  62. cout << ans;
  63. return ;
  64. }

线性

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<cctype>
  7. #include<set>
  8. #include<queue>
  9. #include<vector>
  10. #include<map>
  11. using namespace std;
  12. typedef long long LL;
  13.  
  14. inline int read() {
  15. int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  16. for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  17. }
  18.  
  19. const int N = ;
  20.  
  21. struct Node{
  22. int h, v; LL tot;
  23. }s[N], mv[N], mh[N];
  24.  
  25. bool cmp1(const Node &A, const Node &B) {
  26. return A.tot < B.tot;
  27. }
  28. bool cmp2(const Node &A, const Node &B) {
  29. return A.h < B.h;
  30. }
  31. bool cmp3(const Node &A, const Node &B) {
  32. return A.v < B.v;
  33. }
  34. priority_queue<int, vector<int>, greater<int> > q;
  35. int main() {
  36. int n = read(); LL A = read(), B = read(), C = read();
  37. for (int i = ; i <= n; ++i) {
  38. s[i].h = read(), s[i].v = read(); s[i].tot = A * s[i].h + B * s[i].v;
  39. mv[i] = mh[i] = s[i];
  40. }
  41. sort(s + , s + n + , cmp1);
  42. sort(mh + , mh + n + , cmp2);
  43. sort(mv + , mv + n + , cmp3);
  44.  
  45. int ans = ;
  46. for (int i = ; i <= n; ++i) {
  47. int p = , cnt = ;
  48. LL minv = mv[i].v;
  49. for (int j = ; j <= n; ++j) {
  50. LL minh = mh[j].h, limtot = C + A * minh + B * minv;
  51. while (p <= n && s[p].tot <= limtot) {
  52. if (s[p].v >= minv && s[p].h >= minh) cnt ++, q.push(s[p].h);
  53. p ++;
  54. }
  55. while (!q.empty() && q.top() < minh) cnt--, q.pop();
  56. ans = max(ans, cnt);
  57. }
  58. }
  59. cout << ans;
  60. return ;
  61. }

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. JavaScript设计模式导学

    如何成为一名合格的工程师? 作为一名合格的工程师,不仅需要懂代码,还要懂设计,一名合格工程师的必备条件: 前端开发有一定的设计能力,一般三年开发经验的同学,面试必须考设计能力 成为项目技术负责人,设计 ...

  2. [USACO09MAR]Look Up

    嘟嘟嘟 题面说的有点问题,应该是向后看齐. 于是我们维护一个单调递减栈,如果当前a[i]比栈顶元素大,就执行pop操作,然后把pop出来的元素的答案都用 i 更新即可. #include<cst ...

  3. 【MySQL-123】MySQL8.0.12 安装于Win10

    参考blog:MySQL8.0.12 安装及配置 [坑一]输入net start mysql时,MYSQL服务无法启动. 问题:第三步my.ini文件编码错误. 解决方案:https://blog.c ...

  4. MyBatis(1)-简单入门

    简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...

  5. [Python WEB开发] 使用WSGI开发类Flask框架 (二)

    WSGI     Web服务器网关接口 WSGI主要规定了Web服务器如何与Web应用程序进行通信,以及如何将Web应用程序链接在一起来处理一个请求. wsgiref Python中的WSGI参考模块 ...

  6. AttributeError: 'module' object has no attribute get'

    最近在写python requests相关内容易,突然报错AttributeError: 'module' object has no attribute 'get'" 脚本肯定没问题 怎么 ...

  7. 闲话缓存:ZFS 读缓存深入研究-ARC(一)

    在Solaris ZFS 中实现的ARC(Adjustable Replacement Cache)读缓存淘汰算法真是很有意义的一块软件代码.它是基于IBM的Megiddo和Modha提出的ARC(A ...

  8. oracle定时器在项目中的应用

    业务需求: 现在业务人员提出了一个需求: 在项目中的工作流,都要有一个流程编号,此编号有一定的规则: 前四五位是流程的字母缩写,中间是8位的日期,后面五位是流水码,要求流水码每天从00001开始.即: ...

  9. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区(转载)

    一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: 1 create table graderecord 2 ( 3 sno varchar2(10), 4 sname varcha ...

  10. iOS 数据安全、数据加密传输

    近期接到一个新需求:APP企业版需要接入热更新功能. 热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击. 需要用到数据加密传输方面的知识,以下是我设计的加密解密流程: ...