666
#include<bits/stdc++.h>
using namespace std;
#define ll int
const double CLOCKS_PER_SECOND=((clock_t)14000);
ll T,n,m,c[1000000],X[1000000],r,t[1000000],C;
ll xuan[100050],a[1000000],tot,cnt,nn,rep[1000000],daan,retot,PP;
vector<ll>fa[50];
bitset<100050>s[50];
bitset<100050>ls,res[100050];
map<ll,ll>M,MM;
struct nood{
ll x,y;
}tj[1000000];
void dfs(ll x,ll co){
// if(T==0){
// // cout<<x<<" ";
// // for(int i=1;i<=n*3;i++){
// // cout<<ls[i]<<"*";
// // }
// // cout<<endl;
// if(clock()-PP>1960000){
// cout<<daan;
// exit(0);
// }
// }
// else{
if(1000*(clock()-C)>=14000*CLOCKS_PER_SECOND){
// cout<<-1;
if(T==0){
cout<<daan;
exit(0);
}
return;
}
// }
// cout<<x<<"**"<<co<<endl;
res[++retot]=ls;
ll op=retot;
// bitset<100005>lss=ls;
if(co>daan){
retot--;
return;
}
if(x>=n){
// cout<<"???";
retot--;
daan=min(daan,co);
return;
}
if(ls[x+2]==1){
if(ls[x+3]==1){
if(ls[x+5]==1){
if(ls[x+6]==1){
dfs(x+6,co);
}
else if(ls[x+7]==1){
dfs(x+7,co);
}
else{
dfs(x+5,co);
}
}
else if(ls[x+4]==1){
if(ls[x+6]==1){
dfs(x+6,co);
}
else if(ls[x+5]==1){
dfs(x+5,co);
}
else{
dfs(x+4,co);
}
}
else{
dfs(x+3,co);
}
}
else if(ls[x+4]==1){
if(ls[x+6]==1){
dfs(x+6,co);
}
else if(ls[x+5]==1){
dfs(x+5,co);
}
else{
dfs(x+4,co);
}
}
else{
dfs(x+2,co);
}
}
else if(ls[x+1]==1){
if(ls[x+3]==1){
if(ls[x+5]==1){
if(ls[x+7]==1){
dfs(x+7,co);
}
else if(ls[x+6]==1){
dfs(x+6,co);
}
else
dfs(x+5,co);
}
else if(ls[x+4]==1){
if(ls[x+6]==1){
dfs(x+6,co);
}
else if(ls[x+5]==1){
dfs(x+5,co);
}
else
dfs(x+4,co);
}
else{
dfs(x+3,co);
}
}
else{
dfs(x+1,co);
}
}
else{
if(X[c[x+2]]<=X[c[x+1]]){
ls|=s[c[x+2]];
dfs(x+2,co+X[c[x+2]]);
ls=res[retot];
ls|=s[c[x+1]];
dfs(x+1,co+X[c[x+1]]);
}
else{
ls|=s[c[x+1]];
dfs(x+1,co+X[c[x+1]]);
ls=res[retot];
ls|=s[c[x+2]];
dfs(x+2,co+X[c[x+2]]);
}
}
retot--;
return;
}
int main(){
cin>>T;
ll PP=clock();
while(T--){
C=clock();
daan=1e9;
tot=cnt=0;
memset(xuan,0,sizeof(xuan));
ll ans=0;
scanf("%d%d",&n,&m);
// cin>>n>>m;
for(int i=1;i<=m;i++){
fa[i].clear();
}
for(int i=0;i<=100001;i++){
s[0][i]=0;
}
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
s[0][i]=0;
fa[c[i]].push_back(i);
s[c[i]][i]=1;
}
for(int i=1;i<=m;i++){
scanf("%d",&X[i]);
// cin>>X[i];
}
scanf("%d",&r);
xuan[c[1]]=1;ans+=X[c[1]];
for(int i:fa[c[1]]){
a[++tot]=i;
}
// cout<<ans<<":1"<<endl;
s[0]|=s[c[1]];
if(!xuan[c[n]]){
for(int i:fa[c[n]]){
a[++tot]=i;
}
ans+=X[c[n]];
xuan[c[n]]=1;
s[0]|=s[c[n]];
}
// cout<<ans<<":n"<<endl;
for(int i=1;i<=r;i++){
scanf("%d",&t[i]);
// cout<<t[i]<<"??"<<endl;
if(!xuan[c[t[i]]]){
for(int i:fa[c[t[i]]]){
a[++tot]=i;
}
ans+=X[c[t[i]]];
xuan[c[t[i]]]=1;
s[0]|=s[c[t[i]]];
}
}
sort(a+1,a+tot+1);
// for(int i=1;i<=tot;i++){
// cout<<a[i]<<" "
//}
// for(int i=1;i<=n;i++){
// cout<<s[0][i]<<" ";
// }
// cout<<endl;
nn=0;
for(int i=1;i<=m;i++){
if(!xuan[i]){
nn++;
rep[nn]=i;
}
}
ls=s[0];
retot=0;
dfs(1,ans);
for(int i=1;i<=m;i++){
for(int j:fa[i]){
s[i][j]=0;
}
}
cout<<daan<<"\n";
}
}
/*
1
10 5
4 2 1 4 5 5 4 1 5 3
7 4 10 1 2
1
5
*/
可以自由转载

浙公网安备 33010602011771号