记录编号 619003 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 3186.序列异或 最终得分 100
用户昵称 exil 是否通过 通过
代码语言 C++ 运行时间 6.746 s
提交时间 2026-09-27 14:59:06 内存使用 32.66 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[71];
int c[50005];
int b[50005];
vector<int>v[50005][2];
int dis[43][50005];
int cnt;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
int f[1148580];
void dsl(int dian){
    dis[dian][a[dian]]=0;
    q.push({0,a[dian]});
    while(!q.empty()){
        int d=q.top().second;
        int len=q.top().first;
        q.pop();
        for(int i = 0;i<v[d][0].size();i++){
            if(dis[dian][v[d][0][i]]>len+v[d][1][i]){
                dis[dian][v[d][0][i]]=len+v[d][1][i];
                q.push({dis[dian][v[d][0][i]],v[d][0][i]});
                //if(v[d][0][i]==2 && dian==1)cout<<"i"<<d<<"i";
            }
        }
    }
}
signed main(){
    //freopen("z.in","r",stdin);
    //freopen("z.out","w",stdout);
    int n,k,l;
    cin>>n>>k>>l;
    n++;
    for(int i = 1;i<=k;i++){
        cin>>a[i];
        c[a[i]]=1;
    }
    for(int i = 1;i<=n;i++){
        if(c[i]^c[i-1]){
            cnt++;
            a[cnt]=i;
        }
    }
    for(int i = 1;i<=l;i++){
        cin>>b[i];
    }
    for(int i = 1;i<=cnt;i++){
        for(int j = 1;j<=n;j++){
            dis[i][j]=INT_MAX;
        }
    }
    for(int i = 1;i<=n;i++){
        
        for(int j = 1;j<=l;j++){
            if(i+b[j]<=n)v[i][0].push_back(i+b[j]),v[i][1].push_back(1);
            if(i-b[j]>0)v[i][0].push_back(i-b[j]),v[i][1].push_back(1);
            
        }
    }
    for(int i = 1;i<=cnt;i++){
        dsl(i);
        
    }
//    for(int i = 1;i<=cnt;i++){
//        for(int j = 1;j<=n;j++){
//            cout<<dis[i][j]<<" ";
//        }
//        cout<<"\n";
//    }
    
    
    for(int i = 0;i<=1148578;i++){
        f[i]=INT_MAX-10000;
    }
    f[0]=0;
    for(int j = 0;j<(1<<cnt);j++){
        
        for(int i = 1;i<=cnt;i++){
            for(int h = i+1;h<=cnt;h++){
                if(((j>>(i-1))&1) || ((j>>(h-1))&1))continue;
                f[j|(1<<(i-1))|(1<<(h-1))]=min(f[j|(1<<(i-1))|(1<<(h-1))],f[j]+min(dis[i][a[h]],dis[h][a[i]]));
            }
            
        }
    }
    if(f[(1<<cnt)-1]==INT_MAX-10000)cout<<-1;
    else cout<<f[(1<<cnt)-1];
    //int r=(1<<(n-1));
    //cout<<r<<"\n";
    
    
    
	return 0;
}