BZOJ1071 [SCOI2007]组队

说好的一天一题解来啦~(其实是给马上要来的NOIP模拟赛加点RP>.<)

Vfk大神说是n^2乱搞,于是蒟蒻就开始乱搞,结果发现怎么搞都是O(n ^ 3)的。。。

后来请教了snake大神,他说先给sum = A * h + B * s排序,然后枚举h和s的最小值。(h -- Height, s -- Speed)

然后就是两个指针乱搞:

先枚举s最小值,然后一边枚举v的最小值一边查询符合条件的人数,因为这一定是相邻的一串。

 1 /**************************************************************
 2     Problem: 1071
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:1708 ms
 7     Memory:1044 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12
13 using namespace std;
14
15 struct data{
16     int s, h, sum;
17 }x[10000], y[10000];
18
19 inline bool cmp1(const data &a, const data &b){
20     return a.h < b.h;
21 }
22
23 inline bool cmp2(const data &a, const data &b){
24     return a.sum < b.sum;
25 }
26
27 int n, Max, Min, l, r, cnt, ans;
28 int A, B, C;
29
30 inline bool check1(int p){
31     return y[p].s <= Max && y[p].s >= Min;
32 }
33
34 inline bool check2(int p){
35     return x[p].s <= Max && x[p].s >= Min;
36 }
37
38 int main(){
39     scanf("%d", &n);
40     scanf("%d%d%d", &A, &B, &C);
41     for (int i = 1; i <= n; ++i){
42         scanf("%d%d", &x[i].h, &x[i].s);
43         x[i].sum = A * x[i].h + B * x[i].s;
44         y[i] = x[i];
45     }
46
47     sort(x + 1, x + n + 1, cmp1);
48     sort(y + 1, y + n + 1, cmp2);
49     for (int i = 1; i <= n; ++i){
50         Min = x[i].s, Max = Min + C / B;
51         l = 0, r = 0, cnt = 0;
52         for (int j = 1; j <= n; ++j){
53             while (r < n && y[r + 1].sum <= A * x[j].h + B * x[i].s + C)
54                 ++r, cnt += check1(r);
55             while (l < n && x[l + 1].h < x[j].h)
56                 ++l, cnt -= check2(l);
57             ans = max(ans, cnt);
58         }
59     }
60     printf("%d\n", ans);
61     return 0;
62 }

时间: 2024-12-25 00:28:00

BZOJ1071 [SCOI2007]组队的相关文章

BZOJ1071 [SCOI2007]压缩 指针

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1071 题意概括 有两个序列a[1..n], b[1..n],其编号为1..n,设为s序列.现在我们要求出最长的满足条件的s的子序列s',设va=min(a[s[i]]), vb=min(b[s[i]]), 满足对于所有的j=s'[i], A*(a[j]-va)+B*(b[j]-vb)<=C. 题解 设v[i]=A*a[i]+B*b[i]; 那么,要求满足v[s'[i]]-A*va-B*vb<=

bzoj 1071: [SCOI2007]组队

Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里 速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有队员都应该满足: A * ( height – minH ) + B * ( speed – minV ) <= C 其中A和B,C为给定的经验值.这个式子很容易理解,如果一个球队的 球员速度和身高差距太大,会造成配合的不协调. 请问作为球队管理层的你,在N名选秀球员中,最多能有多少名 符合条件的

SCOI2007 组队

传送门 这道题该怎么做呢--我自己只能想出来O(n^3)的暴力模拟--不过并不行. 来看一下正解吧--将给定的式子变一下形,得到A*height + B*speed - C <= A*minh+B*mins. 这样的话,把所有的运动员按照A*height + B*speed - C从小到大排序,这样就使得,如果有i成立,那么对于每个j<i,只要这个j的height和speed都不小于最小要求都是合法的. 但是不只有这一个限制.由于height还必须大于等于minh,所以对于任意一个运动员,其s

【题解】SCOI2007组队

恩……为什么大家都这么执着于 \(O(n^{2})\) 的复杂度捏?如果接受 \(O(nV)\) 的复杂度,那这题可不是道**题吗( • ?ω•? )? 首先把所有的人按照身高排个序,然后我们就可以枚举一个人作为身高的最小值.此时,原式 \(A * H + B * V - C <= A * minh + B * minv\) 我们可以把常量固定一下: \(S_{x} = A * H_{x} - C - A * minh\) \(S_{x} + B * V_{x} <= B * minv\) 移

怒刷BZOJ记录(二)1038~10xx

我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-8-13: 正式开始! 1030[JSOI2007]文本生成器                       | ac自动机+DP 1042 [HAOI2008]硬币购物                        | 容斥原理+背包 1045 [HAOI2008] 糖果传递                       | 数学+中位数 1047 [HAOI2007]理想的正方形               

(双指针) bzoj 1071

1071: [SCOI2007]组队 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1267  Solved: 392[Submit][Status][Discuss] Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有队员都应该满足: A * ( height – minH ) + B * ( sp

【BZOJ1071】【SCOI2007】组队 利用单调性的双指针

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45746089"); } 题解: 三个定义:高度h,v速度,Ah+Bv为s 首先我们在外圈枚举来固定其中一个权值,姑且枚举v吧.每次枚举值大写为V. 然后在内圈就可以做单调队列了. 我们枚举让h递增,每次为H,然后发现原来的式子要满足

[SCOI2007]修车

1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 6007  Solved: 2559 [Submit][Status][Discuss] Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最 小. 说明:顾客的等待时间是指从他把车送至维修中心

1069: [SCOI2007]最大土地面积

1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2961  Solved: 1162[Submit][Status][Discuss] Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标. Output 最大的多边形面积,答案精确到