优先队列+贪心
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int D;
int P;
bool operator <(node b) const
{
return P>b.P;
}
}Node[100001];
bool cmp1(int a,int b)
{
return a>b;
}
bool cmp2(node a,node b)
{
return a.D>b.D;
}
int main()
{
int N,M;
while (scanf("%d",&N)!=EOF)
{
priority_queue<node> q;
scanf("%d",&M);
int B[100001];
int i;
for (i=0;i<=N-1;i++)
scanf("%d",&B[i]);
for (i=0;i<=M-1;i++)
scanf("%d",&Node[i].D);
for (i=0;i<=M-1;i++)
scanf("%d",&Node[i].P);
sort(B,B+N,cmp1);
sort(Node,Node+M,cmp2);
int pos=0,counter=0;
__int64 ans=0;
while(!q.empty())
q.pop();
for (i=0;i<=N-1;i++)
{
while (pos<=M-1 && Node[pos].D>=B[i])
{
q.push(Node[pos]);
pos++;
}
if (!q.empty())
{
ans+=q.top().P;
counter++;
q.pop();
}
else
break;
}
if (counter!=N)
printf("No\n");
else
printf("%I64d\n",ans);
}
return 0;
}