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
/* ***********************************************
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组队的更多相关文章
- [BZOJ]1071 组队(SCOI2007)
一道比较NB的套路题. Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为mi ...
- BZOJ 1071 [SCOI2007]组队
1071: [SCOI2007]组队 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1330 Solved: 417[Submit][Status][ ...
- BZOJ.1071.[SCOI2007]组队(思路)
题目链接 三个限制: \(Ah-AminH+Bv-BminV\leq C\ \to\ Ah+Bv\leq C+AminH+BminV\) \(v\geq minV\) \(h\geq minH\) 记 ...
- 1071: [SCOI2007]组队 - BZOJ
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...
- 1071: [SCOI2007]组队
1071: [SCOI2007]组队 https://lydsy.com/JudgeOnline/problem.php?id=1071 分析: dp+单调性. A*(hi–minH)+B*(si–m ...
- [BeiJing2010组队][BZOJ 1977]次小生成树 Tree
话说这个[BeiJing2010组队]是个什喵玩意? 这是一道严格次小生成树,而次小生成树的做法是层出不穷的 MATO IS NO.1 的博客里对两种算法都有很好的解释,值得拥有: (果然除我以外, ...
- Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 304[Submi ...
- BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
做一次MST, 枚举不在最小生成树上的每一条边(u,v), 然后加上这条边, 删掉(u,v)上的最大边(或严格次大边), 更新答案. 树链剖分然后ST维护最大值和严格次大值..倍增也是可以的... - ...
- BZOJ 1977[BeiJing2010组队]次小生成树 Tree - 生成树
描述: 就是求一个次小生成树的边权和 传送门 题解 我们先构造一个最小生成树, 把树上的边记录下来. 然后再枚举每条非树边(u, v, val),在树上找出u 到v 路径上的最小边$g_0$ 和 严格 ...
随机推荐
- 【译】Spark官方文档——编程指南
本文翻自官方博客,略有添加:https://github.com/mesos/spark/wiki/Spark-Programming-Guide Spark发指南 从高的面看,其实每一个Spark的 ...
- android空鼠修改
抛弃盒子自带遥控器后,又不满意改键红外遥控器,选择飞鼠及无线键鼠成为最终方案.问题是:菜单键如何实现!其实很简单:即插即用USB无线飞鼠及键鼠套装只涉及2个文件:system/usr/layout/G ...
- 一个自定义的C#数据库操作基础类 SqlHelper
SqlHelper其实是我们自己编写的一个类,使用这个类目的就是让使用者更方便.更安全的对数据库的操作,既是除了在SqlHelper类以外的所有类将不用引用对数据库操作的任何类与语句,无须担心数据库的 ...
- C++文件操作(输入输出、格式控制、文件打开模式、测试流状态、二进制读写)
1.向文件写数据 头文件#include <ofstream> ①Create an instance of ofstream(创建ofstream实例) ②Open the file w ...
- javascript arguments
此文为转载文章: 什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments ...
- Python脚本控制的WebDriver 常用操作 <七>浏览器前进和后退操作
下面将使用WebDriver来控制浏览器的前进和后退操作 测试用例场景 此操作和get.url()方法功能相同 Python脚本 # coding=gbk ''' Created on 2013年12 ...
- core java 1~4(HelloWorld & 标识符|关键字|数据类型 & 表达式|流程控制 & 数组)
MODULE 1 Java的编译和运行----------------------------编译:javac -d bin src\HelloWorld.java -d:指定编译后的class 文件 ...
- 网络爬虫by pluskid
网络爬虫(Web Crawler, Spider)就是一个在网络上乱爬的机器人.当然它通常并不是一个实体的机器人,因为网络本身也是虚拟的东西,所以这个“机器人”其实也就是一段程序,并且它也不是乱爬,而 ...
- iOS中MVC设计模式
在组织大型项目的代码文件时,我们常用MVC的思想.MVC的概念讲起来非常简单,就和对象(object)一样.但是理解和应用起来却非常困难.今天我们就简单总结一下MVC设计理念. MVC(Model V ...
- js 获取字符串中最后一个斜杠后面的内容
var str = "/asdasf/asfaewf/agaegr/trer/rhh"; var index = str .lastIndexOf("\/"); ...