嘟嘟嘟

这题有人说部分分O(n3)暴力,然而我暴力都没写过,调了半天也没用……还是看题解吧

首先,咱把A * ( h – minH ) + B * ( s – minS ) <= C 变个型,得到 A * h + B * s - C <= A * minH + B * minS. 令 sum = A * h + B * s - C,如果我们把所有球员按sum排序,就能保证取球员的时候是单调的,如果 i 能取,则 j (j < i) 一定能取。

然后我们第一层循环枚举minS,第二层循环枚举minH,然后设两个指针L, R,表示当前符合sum <= A * minH + B * minS的区间,但同时我们还要保证h >= minH && s >= minS,而且根据h >= minH还要保证,s <= minS + C / B.于是就有一个很【强】的做法,我们先把符合的条件的s添加进去,再把队列中不符合条件的h踢出。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<vector>
  8. #include<queue>
  9. #include<stack>
  10. #include<cctype>
  11. using namespace std;
  12. #define enter puts("")
  13. #define space putchar(' ')
  14. #define Mem(a) memset(a, 0, sizeof(a))
  15. typedef long long ll;
  16. typedef double db;
  17. const int INF = 0x3f3f3f3f;
  18. const db eps = 1e-;
  19. const int maxn = 5e3 + ;
  20. inline ll read()
  21. {
  22. ll ans = ;
  23. char ch = getchar(), last = ' ';
  24. while(!isdigit(ch)) last = ch, ch = getchar();
  25. while(isdigit(ch)) ans = (ans << ) + (ans << ) + ch - '', ch = getchar();
  26. if(last == '-') ans = -ans;
  27. return ans;
  28. }
  29. inline void write(ll x)
  30. {
  31. if(x < ) putchar('-'), x = -x;
  32. if(x >= ) write(x / );
  33. putchar(x % + '');
  34. }
  35.  
  36. int n;
  37. ll A, B, C;
  38. struct Node
  39. {
  40. int h, s; ll sum;
  41. }Sum[maxn], H[maxn], S[maxn];
  42. bool cmp1(Node a, Node b) {return a.sum < b.sum;}
  43. bool cmp2(Node a, Node b) {return a.h < b.h;}
  44. bool cmp3(Node a, Node b) {return a.s < b.s;}
  45.  
  46. int ans = ;
  47.  
  48. int main()
  49. {
  50. n = read(); A = read(); B = read(); C = read();
  51. for(int i = ; i <= n; ++i)
  52. {
  53. Sum[i].h = read(), Sum[i].s = read(); Sum[i].sum = (ll)A * Sum[i].h + (ll)B * Sum[i].s - C;
  54. H[i].h = Sum[i].h; H[i].s = Sum[i].s; H[i].sum = Sum[i].sum;
  55. S[i].h = Sum[i].h; S[i].s = Sum[i].s; S[i].sum = Sum[i].sum;
  56. }
  57. sort(Sum + , Sum + n + , cmp1);
  58. sort(H + , H + n + , cmp2);
  59. sort(S + , S + n + , cmp3);
  60. for(int i = ; i <= n; ++i) //枚举minS
  61. {
  62. int L = , R = , cnt = ;
  63. ll Mins = S[i].s;
  64. ll Lims = Mins + C / B;
  65. for(int j = ; j <= n; ++j) //枚举minH
  66. {
  67. ll Limsum = A * H[j].h + B * Mins;
  68. while(R < n && Sum[R + ].sum <= Limsum) //合法区间,但不能保证s,h符合
  69. {
  70. R++;
  71. if(Mins <= Sum[R].s && Sum[R].s <= Lims) cnt++; //符合条件的s
  72. }
  73. while(L < n && H[L + ].h < H[j].h) //维护合法区间左端点
  74. {
  75. L++;
  76. if(Mins <= H[L].s && H[L].s <= Lims) cnt--; //踢出不符合的h
  77. //因为[L, R]中可能有cnt之外的,所以要判断哪些属于cnt,踢出时再cnt--
  78. }
  79. ans = max(ans, cnt);
  80. }
  81. }
  82. write(ans); enter;
  83. return ;
  84. }

[SCOI2007]组队的更多相关文章

  1. BZOJ 1071 [SCOI2007]组队

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

  2. bzoj1071[SCOI2007]组队

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

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

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

  4. 1071: [SCOI2007]组队

    1071: [SCOI2007]组队 https://lydsy.com/JudgeOnline/problem.php?id=1071 分析: dp+单调性. A*(hi–minH)+B*(si–m ...

  5. [SCOI2007]组队 差分

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

  6. 1071: [SCOI2007]组队 - BZOJ

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

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

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

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

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

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

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

随机推荐

  1. MYSQL与MSSQL对比学习

    最近在将公司的一个产品里面相关的MSSQL语句修改为可以在MYSQL上执行的语句 l  优点分析: MYSQL短小精悍,容易上手,操作简单,免费供用的.相对其它数据库有特色又实用的语法多一些.SQL怎 ...

  2. 算法 - 排序数组中与x最近一点

    条件: a[j] + a[j+1] < x*2 int findClosestPoint(int x,int a []) { int res = 0; int j = 0; while(j< ...

  3. Android开发之旅1:环境搭建及HelloWorld

    ——工欲善其事必先利其器 引言 本系列适合0基础的人员,因为我就是从0开始的,此系列记录我步入Android开发的一些经验分享,望与君共勉!作为Android队伍中的一个新人的我,如果有什么不对的地方 ...

  4. 如何将钉钉集成到FineReport插件中

    报表服务器 安装钉钉管理插件后,打开报表管理平台,管理系统下会增加钉钉管理节点,钉钉相关的配置管理都将会放在这个节点中去配置: 同时,设置定时任务的最后一步输出设置中,会增加推送钉钉消息: 钉钉企业应 ...

  5. Android属性动画简单剖析

    运行效果图: 先看布局文件吧,activity_main.xml: <?xml version="1.0" encoding="utf-8"?> & ...

  6. mysql 免安装版

    通过MySQL安装程序(.msi文件)来安装虽然简洁高效,但不够灵活,所以我们这里介绍免安装版. 1.  下载: 进入官网-->Downloads-->Community(社区版)--&g ...

  7. vmware虚拟机挂载Windows磁盘的两种方法

    第一种 vmware虚拟机通过ntfs-3g挂接windows盘 1.共享windows盘虚拟机设置——>添加硬盘——>选择IDE——>使用物理磁盘——>选择本地盘(单分区)— ...

  8. C语言占位符

    占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑. 格式占位符(%)是在C/C++语言中格式输入函数,如 scanf.printf 等函数中使用.其意义就是 ...

  9. POST请求的forHTTPHeaderField

    POST请求的forHTTPHeaderField 也许你的iOS项目中使用了AFNetworking2.0,或者是ASIHTTPRequest,对于http中POST请求的操作,你用了他们提供的现成 ...

  10. 使用FastCoder写缓存单例

    使用FastCoder写缓存单例 FastCoder可以存储字典,数组,鄙人将FastCoder封装,CoreData可以缓存的东西,用这个都可以缓存,但是只适合缓存少量的数据(不适合存储几万条数据) ...