【题解】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\)

移项得到 \(V_{x} - minv <= -S_{x}\)

不过仅仅满足这一个条件还不够,还有一个限制条件为

\(V_{x} >= minv\)

整理一下,把 minv 作为变量

 \( S_{x} + V_{x} <= minv <= V_{x}\)

 这样我们在 v 的取值范围上差分一下,取最值即可。

  以及虽然复杂度略高,但是鉴于优秀的常数 & 算法内容的操作简单,跑起来很快 :洛谷rank1~

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
int n, A, B, C, mx, ans, a[maxn]; 

int read()
{
    int x = 0, k = 1;
    char c; c = getchar();
    while(c < ‘0‘ || c > ‘9‘) { if(c == ‘-‘) k = -1; c = getchar(); }
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x * k;
}

struct node
{
    int v, h;
    friend bool operator <(const node& a, const node& b)
    { return a.h < b.h; }
}P[maxn];

void Work(int x)
{
    int H = P[x].h, T = H * A;
    for(int i = x; i <= n; i ++)
    {
        int l = max(0, P[i].v - (T - A * P[i].h + C) / B);
        int r = P[i].v;
        if(l > r) continue;
        a[l] ++, a[r + 1] --;
    }

    for(int i = 0, tem = 0; i <= mx; i ++)
    {
        a[i] += tem; tem = a[i];
        ans = max(ans, a[i]); a[i] = 0;
    }
}

int main()
{
    n = read(); A = read(), B = read(), C = read();
    for(int i = 1; i <= n; i ++)
    {
        P[i].h = read(), P[i].v = read();
        mx = max(mx, P[i].v);
    }
    sort(P + 1, P + 1 + n);
    for(int i = n; i >= 1; i --) Work(i);
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/twilight-sx/p/9908713.html

时间: 2024-10-11 04:26:14

【题解】SCOI2007组队的相关文章

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 /*******************************

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

怒刷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,然后发现原来的式子要满足

题解 P2472 【[SCOI2007]蜥蜴】

题目链接 Solution [SCOI2007]蜥蜴 题目大意:给定一个\(n\)行\(m\)列的地图,每个点有一个经过次数限制,可以从一个点跳到与它距离不超过\(d\)的另一个点.问有多少只蜥蜴不能从地图中出去 题目分析:有多少只蜥蜴不能从地图中出去,可以转化成最多有多少只蜥蜴可以从地图中出去.然后从一个点跳到另一个点我们自然而然想到连有向边,每个点的经过次数限制可以看做是流量上限.最多有多少只蜥蜴可以出去,就是求最大流量.这不就是一个最大流么.然后我们来看核心--建图 首先,普通的最大流问题

【题解】Luogu P2472 [SCOI2007]蜥蜴

原题传送门 题目要求无法逃离的最少有多少 直接做肯定不好做,我们帮题目变一个说法:最多能逃离多少 这个询问一看就是最大流 考虑如何建图: 1.将S和每一个有蜥蜴的点连一条流量为1的边(每个蜥蜴只能用1次) 2.每个点拆成两个点(一个点用来连接从其他点连来的边,另一个点用来向其他的点连边,下同),从前一个点向后一个点连一条流量为石柱高度的边(每个石柱只能踩它的高度次) 3.能互相到达的石柱之间连一条流量为inf的边 4.将每一个能跳出地图的点向T连一条流量为inf边 建图后跑一下最大流即可求出答案

BZOJ1067: [SCOI2007]降雨量

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4185  Solved: 1119[Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“200