题目链接

https://ac.nowcoder.com/acm/contest/8564/A

解题思路

大致思路:
建立结构体保存每个基地的防御力和价值,按照防御力从小到大排序(价值大小无所谓);
再遍历排完序的基地结构体数组,保存小于等于当前遍历到的基地的防御力的最大价值;
遍历飞机的攻击力数组,二分找到防御力小于当前遍历到的飞机攻击力的基地,加上保存在最大价值数组中的值;
输出答案。
详细思路:
见代码注释

AC代码

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;

const int N=1e6+100;

int a[N],d[N],v,n,m,mx[N],pos;
ll ans;
struct node
{
    int d,v;    
}bb[N];

bool cmp(node a,node b)
{
    return a.d<b.d;//价值无所谓,只要排防御力就行
}

int new_lower_bound(int x)//y总板子
{
    int l=0,r=m;
    while(l<r)
    {
        int mid=l+r+1>>1;//加1防止出现死循环
        if(bb[mid].d<x) l=mid;
        else r=mid-1;
    }
    return r;
}

int main()
{
    cin>>n>>m;
    bb[0].d=0;bb[0].v=0;//多插一组,防止出现飞机中的最小攻击力比基地最小防御力还小的情况
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>d[i];
    for(int i=1;i<=m;i++)
    {
        cin>>v;
        bb[i].d=d[i];
        bb[i].v=v;
    } 
    sort(bb+1,bb+m+1,cmp);
    for(int i=1;i<=m;i++)
    mx[i]=max(mx[i-1],bb[i].v);//mx数组用于保存排完序后,前i个基地(含第i个)的最大价值

    for(int i=1;i<=n;i++)
    {
        pos=new_lower_bound(a[i]);//我们找到的其实是小于a[i]且最大的位置(举例:01112,对应的下标从1开始,假如当前a[i]=2,我们通过newlowerbound函数返回的其实第三个1的位置,即下标为4)
        ans+=mx[pos];//让答案加上小于等于pos位置的最大价值(在pos位置及之前的位置的基地的防御力一定比当前飞机的攻击力小)
    }
    cout<<ans<<endl;
}