BZOJ1071

传送门:BZOJ1071

枚举minH,minV,单调性优化+计不可行方案数即可。

代码上的细节较多。

代码上的小细节见下。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5050
using namespace std;

int A,B,C;

struct KSD
{
    int h,v;
    long long s;
    void keep(){
        s=A*h+B*v;
    }
};

KSD x[5005],y[5005],z[5005],r[5005];
int n;
int ans;

bool cmph(KSD a,KSD b)
{
    return a.h<b.h;
}

bool cmpv(KSD a,KSD b)
{
    return a.v<b.v;
}

bool cmps(KSD a,KSD b)
{
    return a.s<b.s;
}

void Solve()
{
    sort(x,x+n,cmph);
    sort(y,y+n,cmpv);
    sort(z,z+n,cmps);
    for(int i=0;i<n;i++){
        int pos=0,p=0,cnt=0;
        for(int j=0;j<n;j++)
            if(x[i].h<=y[j].h&&x[i].v>=y[j].v)
                r[pos++]=y[j];
        for(int j=0;j<pos;j++){
            long long res=A*x[i].h+B*r[j].v+C;
            while(p<n&&z[p].s<=res){
                if(z[p].v<r[j].v||z[p].h<x[i].h)
                    cnt++;
                p++;
            }
            ans=max(ans,p-cnt);
            if(A*r[j].h+B*r[j].v<=res)
                cnt++;  //在51行中不会被检出,但下一次循环应舍弃。
        }
    }
    printf("%d\n",ans);
}

void Readdata()
{
    freopen("loli.in","r",stdin);
    scanf("%d%d%d%d",&n,&A,&B,&C);
    for(int i=0;i<n;i++){
        scanf("%d%d",&x[i].h,&x[i].v);
        x[i].keep();
        z[i]=y[i]=x[i];
    }
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Readdata();
    Solve();
    Close();
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 16:00:15

BZOJ1071的相关文章

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<=

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

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