给个的做法,瓶颈在于离散化

大致思路是开桶记前缀max,代码易懂

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 5;
inline int read(){
    int x = 0,f = 1;char c = getchar();
    while(!isdigit(c)) {if(c=='-')f=-1;c = getchar();} 
    while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int n,m,a[N<<1],b[N],cnt,siz,tong[N],ans,maxx[N];
struct node{int d,v;}e[N];
inline bool cmp(int x,int y){
    return x < y;
}
int main(){
    n = read(); m = read(); cnt = n;
    for(int i = 1;i <= n;++i) b[i] = a[i] = read();
    for(int i = 1;i <= m;++i) b[++cnt] = e[i].d = read();
    sort(b + 1,b + cnt + 1,cmp);
    siz = unique(b + 1,b + cnt + 1) - b-1;
    for(int i = 1;i <= n;++i)
        a[i] = lower_bound(b + 1,b + siz + 1,a[i]) - b;
    for(int i = 1;i <= m;++i)
        e[i].d = lower_bound(b + 1,b + siz + 1,e[i].d) - b;
    for(int i = 1;i <= m;++i)
        tong[e[i].d] = max(tong[e[i].d],read());
    for(int i = 1;i < N;++i){
        maxx[i] = max(maxx[i-1],tong[i]);
    }
    for(int i = 1;i <= n;++i)
        ans += maxx[a[i]-1];
    printf("%d",ans);
}