CF 双倍经验题 A 了,交洛谷 T 了三个点,求助 /kel
是复杂度假了还是常数太大被卡了 qwq /kk
#include <bits/stdc++.h>
using namespace std;
const int N = 40005,M = 2e7+5,K = (1 << 22) + 1;
struct edge{int to,nxt;}e[M];
int head[N],cnt,k,l,p[N],a[N],dis[22][N],b[N],n,c[N],tot,d[22][22],vis[22];
long long ans,res = 1e18,f[K];
void add(int u,int v){e[++cnt].to = v,e[cnt].nxt = head[u],head[u] = cnt;}
void bfs(int s,int *dis){
for(int i = 1;i <= n+1;i ++) dis[i] = 1e9;
dis[s] = 0;queue<int> q;q.push(s);
while(q.size()){
int u = q.front();q.pop();
for(int i = head[u],v;v = e[i].to,i;i = e[i].nxt)
if(dis[v] > dis[u] + 1) dis[v] = dis[u] + 1,q.push(v);
}
}int main(){
// freopen("light.in","r",stdin),freopen("light.out","w",stdout);
cin >> n >> k >> l;
for(int i = 1;i <= k;i ++) cin >> p[i],b[p[i]] ^= 1,b[p[i]+1] ^= 1;
for(int i = 1;i <= n + 1;i ++) if(b[i]) c[++tot] = i;
if(tot & 1) return cout << -1,0;
for(int i = 1;i <= l;i ++) cin >> a[i],a[i] --;
sort(a+1,a+l+1);
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= l;j ++)
if(i + a[j] <= n) add(i,i+a[j]+1),add(i+a[j]+1,i);
else break;
}for(int i = 1;i <= tot;i ++) bfs(c[i],dis[i]);
for(int i = 1;i <= tot;i ++) for(int j = 1;j <= tot;j ++) d[i][j] = dis[i][c[j]];
f[0] = 0;
for(int i = 1;i <= (1 << tot);i ++) f[i] = 1e18;
for(int i = 0;i <= (1 << tot);i ++){
for(int j = 0;j < tot;j ++){
if((i >> j) & 1) continue;
for(int k = 0;k < tot;k ++) if(!((i >> k) & 1) && k != j)
f[i | (1 << j) | (1 << k)] = min(f[i | (1 << j) | (1 << k)],f[i] + d[j+1][k+1]);
}
}
cout << (f[(1 << tot) - 1] >= 1e9 ? -1 : f[(1 << tot) - 1]);
}