BZOJ 1071组队
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1071
题目很好,居然写了很久,题解找了真多;
主要两种做法:
O(n^2lgn),通过优先堆维护,首先 等式变换:A*height+B*speed-C<=A*minheight+B*minspeed;
增加a[i].val=A*height+B*speed-C:
对a按height排序;
然后枚举i 把a[i].s作为min
1 /* *********************************************** 2 Author :forgot93 3 Created Time :2014/12/23 星期二 上午 9:00:41 4 File Name : 5 ************************************************ */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <stdlib.h> 17 #include <time.h> 18 using namespace std; 19 20 #define N 5555 21 typedef long long ll; 22 priority_queue<ll> q; 23 24 struct node 25 { 26 ll h,s; 27 ll val; 28 bool operator < (const node &b) const{ 29 return h>b.h; 30 } 31 }a[N]; 32 33 34 int main() 35 { 36 int n; 37 ll A,B,C; 38 cin>>n>>A>>B>>C; 39 for (int i=1;i<=n;i++){ 40 cin>>a[i].h>>a[i].s; 41 a[i].val=A*a[i].h+B*a[i].s-C; 42 } 43 ll ans=1; 44 sort(a+1,a+n+1); 45 46 for (int i=1;i<=n;i++) 47 { 48 ll minh=a[i].h; 49 ll mins=a[i].s; 50 while (!q.empty()) q.pop(); 51 q.push(a[i].val); 52 for (int j=1;j<=n;j++) 53 if (j!=i&&a[j].s>=mins) 54 { 55 minh=min(minh,a[j].h); 56 ll tmp=B*mins+A*minh; 57 if (a[i].val>tmp) break; 58 while (!q.empty()&&q.top()>tmp) q.pop(); 59 if (a[j].val<=tmp) 60 { 61 q.push(a[j].val); 62 ans=max(ans,(ll) q.size()); 63 } 64 } 65 } 66 cout<<ans<<endl; 67 return 0; 68 }
View Code
speed;
接着暂时minheight=a[i].h;
a[i].h 是从大到小排序的;
接下来维护堆,我们枚举j 对于j!=i且a[j].s>=mins,
同时更新minheight;
然后把val满足的压入堆中;
对q.top()>val q.pop();
因为mins固定,minh是单调递减的所以前面满足的后面也会满足(这里请仔细考虑);
时间是1100ms;
第二种是o(n*n);
时间是848ms;
关键字:单调;
1 /* *********************************************** 2 Author :forgot93 3 Created Time :2014/12/23 ÐÇÆÚ¶þ ÏÂÎç 2:46:36 4 File Name :c.cpp 5 ************************************************ */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17 #include <stdlib.h> 18 #include <time.h> 19 using namespace std; 20 21 typedef long long ll; 22 #define N 5555 23 struct node 24 { 25 int h,v; 26 ll val; 27 }H[N],V[N],a[N],r[N]; 28 29 int cmp1(node x,node y) 30 { 31 if (x.h==y.h) return x.v<y.v; 32 return x.h<y.h; 33 } 34 int cmp2(node x,node y) 35 { 36 if (x.v==y.v) return x.h<y.h; 37 return x.v<y.v; 38 } 39 40 int cmp3(node x,node y) 41 { 42 return x.val<y.val; 43 } 44 45 46 int main() 47 { 48 int n; 49 ll A,B,C; 50 cin>>n>>A>>B>>C; 51 for (int i=0;i<n;i++){ 52 cin>>a[i].h>>a[i].v; 53 a[i].val=A*a[i].h+B*a[i].v-C; 54 H[i]=V[i]=a[i]; 55 } 56 sort(a,a+n,cmp3); 57 sort(V,V+n,cmp2); 58 sort(H,H+n,cmp1); 59 int ans=0; 60 for (int i=0;i<n;i++) 61 { 62 int minh=H[i].h,p=0,cnt=0,tot=0; 63 for (int j=0;j<n;j++) 64 if (V[j].h>=minh&&V[j].v<=H[i].v) 65 r[tot++]=V[j]; 66 for (int j=0;j<tot;j++) 67 { 68 int minv=r[j].v; 69 ll res=A*minh+B*minv; 70 while (p<n&&a[p].val<=res) 71 { 72 if (a[p].h<minh||a[p].v<minv) cnt++; 73 p++; 74 } 75 ans=max(p-cnt,ans); 76 if (res>=A*r[j].h+B*r[j].v-C) cnt++; 77 if (p==n) break; 78 } 79 } 80 printf("%d\n",ans); 81 return 0; 82 }
View Code
首先 按照某些关键字排序。
for i minh=a[i].h;
然后枚举 j 寻找mins,mins<a[i],s;
然后是单调队列;
有这样一个性质:我们枚举指针的时候是按val 从小到大拍好顺序的,我们枚举的mins也是从小到大的,所以:
(这里) 前面的元素一定满足后面的,怎么理解?
枚举的mins2能够满足mins1的所有元素,所以指针p不必归0了。
所以就会O(n^2);
转载于:https://www.cnblogs.com/forgot93/p/4180221.html
BZOJ 1071组队相关推荐
- [BZOJ]1071 组队(SCOI2007)
一道比较NB的套路题. Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为mi ...
- [BZOJ]1071: [SCOI2007]组队 STL优先队列
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里 速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所 ...
- (双指针) bzoj 1071
1071: [SCOI2007]组队 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 1267 Solved: 392 [Submit][Status ...
- BZOJ 1977: [BeiJing2010组队]次小生成树(Kruskal+树上倍增)
1977: [BeiJing2010组队] 次小生成树 Tree Time Limit: 10 Sec Memory Limit: 512 MB Description 小 C 最近学了很多最小生成树 ...
- 1071: [SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1763 Solved: 546 [ Submit][ St ...
- BZOJ 1977 [BeiJing2010组队]次小生成树 Tree
严格次小生成树.一开始没有特批一圈都相等的情况,一直WA,十分难受. 先生成最小生成树,枚举每条非树边,连上它构成一个环,拆掉环上树边中最大的一条(若和该边相等则次大的一条)换上这条. 用倍增维护一条 ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
最新文章
- 文件共享同步5种方式:NFS、NAS、rsync、scp、ftp
- POJ - 2676 Sudoku(dfs)
- .Net4.0 Parallel编程(三)Data Parallelism下
- android应用对于内存的大小是有限制的,Android 的内存限制
- mysql怎么初始化自增值_MySQL 重置自增值
- linux运维架构师职业规划
- Idea运行报错Error running ‘Application‘: Command line is too long的解决方法
- paip.java 注解的详细使用代码
- 编写一个应用程序,给出汉字“你”“我”“他”在Unicode表中的位置
- 求最大公约数(辗转相除法)
- Bulletproofs、Sigma protocol、Halo2等ZK方案小结
- 联想服务器光驱安装win7系统,联想光盘安装win7系统教程
- wamp mysql 远程访问_wamp远程登录配置步骤
- win7保护眼睛的颜色设置方法
- chrome 切换标签页快捷键_如何在Chrome浏览器中切换标签页
- Flink学习1——运行时架构(standalone模式)
- 2020-11-17 C语言的历史
- 五边形lisp程序_AutoCAD LISP绘制圆内接五边形
- 识别验证码之百度智能云Api识别
- 用简单命令查看Windows上USB盘使用记录
热门文章
- jemeter python接口自动化测试平台_接口自动化测试平台
- Java笔记-RabbitMQ中生产者端confirm模式
- 2.3线性表的链式表示和实现
- python截取字符串函数substr_PHP substr():截取字符串
- java calendar 转换_[java]转:String Date Calendar之间的转换
- 郭凯天:中国公益慈善行业数字化观察与思考
- HTTP WS 区别
- Can 总线 收发原理
- js页面倒计时7天 java_javascript实现倒计时效果
- liunxu mysql_Liunx下安装MySql