| 记录编号 |
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;
}