题目链接: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

 /* ***********************************************
Author :forgot93
Created Time :2014/12/23 星期二 上午 9:00:41
File Name :
************************************************ */ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <stdlib.h>
#include <time.h>
using namespace std; #define N 5555
typedef long long ll;
priority_queue<ll> q; struct node
{
ll h,s;
ll val;
bool operator < (const node &b) const{
return h>b.h;
}
}a[N]; int main()
{
int n;
ll A,B,C;
cin>>n>>A>>B>>C;
for (int i=;i<=n;i++){
cin>>a[i].h>>a[i].s;
a[i].val=A*a[i].h+B*a[i].s-C;
}
ll ans=;
sort(a+,a+n+); for (int i=;i<=n;i++)
{
ll minh=a[i].h;
ll mins=a[i].s;
while (!q.empty()) q.pop();
q.push(a[i].val);
for (int j=;j<=n;j++)
if (j!=i&&a[j].s>=mins)
{
minh=min(minh,a[j].h);
ll tmp=B*mins+A*minh;
if (a[i].val>tmp) break;
while (!q.empty()&&q.top()>tmp) q.pop();
if (a[j].val<=tmp)
{
q.push(a[j].val);
ans=max(ans,(ll) q.size());
}
}
}
cout<<ans<<endl;
return ;
}

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;

关键字:单调;

 /* ***********************************************
Author :forgot93
Created Time :2014/12/23 ÐÇÆÚ¶þ ÏÂÎç 2:46:36
File Name :c.cpp
************************************************ */ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std; typedef long long ll;
#define N 5555
struct node
{
int h,v;
ll val;
}H[N],V[N],a[N],r[N]; int cmp1(node x,node y)
{
if (x.h==y.h) return x.v<y.v;
return x.h<y.h;
}
int cmp2(node x,node y)
{
if (x.v==y.v) return x.h<y.h;
return x.v<y.v;
} int cmp3(node x,node y)
{
return x.val<y.val;
} int main()
{
int n;
ll A,B,C;
cin>>n>>A>>B>>C;
for (int i=;i<n;i++){
cin>>a[i].h>>a[i].v;
a[i].val=A*a[i].h+B*a[i].v-C;
H[i]=V[i]=a[i];
}
sort(a,a+n,cmp3);
sort(V,V+n,cmp2);
sort(H,H+n,cmp1);
int ans=;
for (int i=;i<n;i++)
{
int minh=H[i].h,p=,cnt=,tot=;
for (int j=;j<n;j++)
if (V[j].h>=minh&&V[j].v<=H[i].v)
r[tot++]=V[j];
for (int j=;j<tot;j++)
{
int minv=r[j].v;
ll res=A*minh+B*minv;
while (p<n&&a[p].val<=res)
{
if (a[p].h<minh||a[p].v<minv) cnt++;
p++;
}
ans=max(p-cnt,ans);
if (res>=A*r[j].h+B*r[j].v-C) cnt++;
if (p==n) break;
}
}
printf("%d\n",ans);
return ;
}

 

首先 按照某些关键字排序。

for i minh=a[i].h;

然后枚举 j 寻找mins,mins<a[i],s;

然后是单调队列;

有这样一个性质:我们枚举指针的时候是按val 从小到大拍好顺序的,我们枚举的mins也是从小到大的,所以:

(这里) 前面的元素一定满足后面的,怎么理解?

枚举的mins2能够满足mins1的所有元素,所以指针p不必归0了。

所以就会O(n^2);

BZOJ 1071组队的更多相关文章

  1. [BZOJ]1071 组队(SCOI2007)

    一道比较NB的套路题. Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为mi ...

  2. BZOJ 1071 [SCOI2007]组队

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

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

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

  4. 1071: [SCOI2007]组队 - BZOJ

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

  5. 1071: [SCOI2007]组队

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

  6. [BeiJing2010组队][BZOJ 1977]次小生成树 Tree

    话说这个[BeiJing2010组队]是个什喵玩意? 这是一道严格次小生成树,而次小生成树的做法是层出不穷的 MATO IS NO.1 的博客里对两种算法都有很好的解释,值得拥有:  (果然除我以外, ...

  7. Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 879  Solved: 304[Submi ...

  8. BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )

    做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...

  9. BZOJ 1977[BeiJing2010组队]次小生成树 Tree - 生成树

    描述: 就是求一个次小生成树的边权和 传送门 题解 我们先构造一个最小生成树, 把树上的边记录下来. 然后再枚举每条非树边(u, v, val),在树上找出u 到v 路径上的最小边$g_0$ 和 严格 ...

随机推荐

  1. 7-ZIP实现数据高度压缩

    From:http://www.cnblogs.com/killerlegend/p/3746395.html Author:KillerLegend Date:2013.5.22 选中文件,鼠标右键 ...

  2. java作用域public ,private ,protected 及不写时的区别(转)

    在说明这四个关键字之前,我想就class之间的关系做一个简单的定 义,对于继承自己的class,base class可以认为他们都是自己的子 女,而对于和自己一个目录下的classes,认为都是自己的 ...

  3. IOS应用程序生命周期

    一.IOS应用的5种状态 Not Running(非运行状态) 应用没有运行或被系统终止. Inactive(前台非活动状态) 应用正在进入前台状态,但是还不能接受事件处理. Active(前台活动状 ...

  4. yhd日志分析(一)

    yhd日志分析(一) 依据yhd日志文件统计分析每日各时段的pv和uv 建hive表, 表列分隔符和文件保持一致 load数据到hive表 写hive sql统计pv和uv, 结果保存到hive表2 ...

  5. SharePoint 项目的死法(一)

    SharePoint是Microsoft的一个巨NB的产品, 从可查到的数据来看, 财富500强中已经有超过80%的企业已经使用了SharePoint的不同版本,从项目实施的经验来看, 个人感觉这个数 ...

  6. MongoDB牛刀小试

    MongoDB基本操作 1.MongoDB的启动 首先创建一个目录作为MongoDB的工作目录: 进入MongoDB的bin目录: 执行mongod命令,使用参数--dbpath指定MongoDB的工 ...

  7. Android--获取标题栏,状态栏,屏幕高度

    获取状态栏高度 Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int ...

  8. hdu 5281 Senior's Gun

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5281 Senior's Gun Description Xuejiejie is a beautifu ...

  9. Windows Phone自定义控件 ProgressRing

    前言 Windows Phone为开发者提供了很多原生控件,但在很多场景下我们需要对默认的功能或样式做一定的修改才能满足我们的需求,自定义控件应运而生.本文通过以自定义控件进度环(ProgressRi ...

  10. iOS学习之事件处理

    一.事件的基本概念      1.事件概述 事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象. 系统将事件按照特定的路径传递给可以对其进行处理的对象. 在iOS汇总,一个UITo ...