提交时间:2023-12-15 11:58:41

运行 ID: 24221

#include<bits/stdc++.h> #pragma gcc optimize(2) #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn=5e5+10,mod=998244353; inline int read(){ int x=0; short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,m,k,d,c[maxn],a[maxn]; vector<int>P[maxn]; bool chk(int x){ if(!x)return 1; up(i,1,x)P[i].clear(); up(i,1,k)P[(i-1)%x+1].p_b(a[i]); up(i,1,x){ P[i].p_b(n);int lst=1; for(int x:P[i]){ if(x-lst>d)return 0; lst=x; } }return 1; } void slv(){ n=read(),m=read(),k=read(),d=read(); up(i,1,m)c[i]=read();up(i,1,k)a[i]=read(); sort(a+1,a+k+1),sort(c+1,c+m+1),reverse(c+1,c+m+1); int l=0,r=m+1; while(l+1<r){ int mid=l+r>>1; if(chk(mid))l=mid; else r=mid; }ll res=0; if(!l){ l++;a[++k]=n; int lst=1; up(i,1,k){ if(a[i]-lst>d)res+=c[l]; lst=a[i]; } } up(i,l+1,m)res+=c[i]; cout<<res<<'\n'; } int main(){ int t=read();while(t--)slv(); return 0; }