继2h前以为是cpu性能回去尝试优化,改成滚动,极限数据跑进 300ms
#include<bits/stdc++.h>
#define r (l+k)
using namespace std;
typedef long long LL;
const int N=1e6+5;
int n,k,f[N][2],ans[N];
LL a[N],m;
inline LL Rd(){
LL s=0,w=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while (ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
}
int main(){
n=Rd();k=Rd();m=Rd();
for(int i=1;i<=n;i++) a[i]=Rd(),ans[i]=i;
int l=1;
for(int i=1;i<=n;i++){
while (r<n&&a[r+1]-a[i]<a[i]-a[l]) l++;
f[i][0]=a[r]-a[i]>a[i]-a[l]?r:l;
}
LL re=m;
if(re&1){re--;for(int i=1;i<=n;i++) ans[i]=f[ans[i]][0];}
for(int j=1;(1ll<<j)<=m;j++){
for(int i=1;i<=n;i++){
f[i][j&1]=f[f[i][j&1^1]][j&1^1];
}
if((1ll<<j)==(re&(-re))){
re-=(re&(-re));
for(int i=1;i<=n;i++) ans[i]=f[ans[i]][j&1];
}
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
}
所以牺牲空间的同时,时间也会一并被牺牲掉是吗/jy