比赛 hs自测赛 评测结果 AAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Activating Robots 最终得分 100
用户昵称 梦那边的美好ET 运行时间 3.995 s
代码语言 C++ 内存使用 16.95 MiB
提交时间 2025-01-15 17:33:23
显示代码纯文本
#include<bits/stdc++.h>
#define maxn (1<<19)+10
#define maxm ((1<<19)+10)*23
using namespace std;
int n,L,R,a[maxn],f[maxm],K,ans,v1,v2,cntt;
int dst(int l,int r){
    l=abs(l-r);
    return min(l,L-l);
}
priority_queue<pair<int,int>>q1;
bitset<maxm>vs;
int main(){
	freopen("activating_robots.in","r",stdin);
	freopen("activating_robots.out","w",stdout);
    scanf("%d%d%d%d",&L,&R,&n,&K);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    n=unique(a+1,a+n+1)-a-1;
    a[n+1]=a[1]+L;
    for(int i=0;i<(1<<R-1);i++)
        for(int j=0;j<R;j++)
		    f[i*R+j]=L+L+1;
    q1.emplace(f[0]=0,0);
    ans=L+L+1;
    while(1){
        int x=q1.top().second;q1.pop();
        if(vs[x])continue;
        vs[x]=1,v1=f[x];
		int k=x/R;x%=R;
        int p=(v1+x*(L/R))%L;
        if(k==(1<<R-1)-1){
            printf("%lld\n",1ll*v1*K);
            return 0;
        }
        for(int y=1;y<R;++y){
            if((k>>y-1)&1)continue;
            int q=(v1+y*(L/R))%L;
            v2=((p-q+L)%L+K)/(K+1);
            if(K>1){
                if(q<p)q+=L;
                v2=min(v2,(q-p-1)/(K-1)+1);
            }
            int r=(k|(1<<y-1))*R+y;v2+=v1;
            q=(v2+y*(L/R))%L;
            v2+=*lower_bound(a+1,a+n+1,q)-q;
            if(f[r]>v2)q1.emplace(-(f[r]=v2),r);
        }
    }
    return 0; 
}