给个的做法,瓶颈在于离散化
大致思路是开桶记前缀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); }