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 
*/
posted @ 2025-09-06 12:02  MistyPost  阅读(34)  评论(0)    收藏  举报