以下代码在云斗上会 CE,但是在洛谷 c++14 的 IDE ,以及我赛时 "g++ maze.cpp -std=c++14 -o maze.exe" 都没有 CE,会寄吗。
主要就是,time(NULL) 的问题。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <random>
#define int long long
using namespace std;
int T,n,k,m;
int w[200005];
int q[200005];
inline void in(int &n){
n=0;
char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0'&&c<='9') n=n*10+c-'0',c=getchar();
return ;
}
namespace sub2{
int las;
bool mp[200005];
inline void dfs(int u){
if(u>=n) return ;
if(las>=w[u]){
mp[u]=1,las-=w[u];
dfs(u<<1);
dfs(u<<1|1);
}else{
dfs(u<<1|1);
dfs(u<<1);
}
return ;
}
inline void out(int u){
if(u>=n){printf("%lld ",q[u]);return ;}
if(mp[u]) out(u<<1),out(u<<1|1);
else out(u<<1|1),out(u<<1);
return ;
}
inline void work(){
for(int i=1;i<=2*n;i++) mp[i]=0;
las=k;
dfs(1);
out(1);
puts("");
return ;
}
}
struct node{int len,a[65];};
bool operator < (node p,node q){
int len=p.len;
for(int i=1;i<=len;i++)
if(p.a[i]!=q.a[i]) return p.a[i]<q.a[i];
return 0;
}
node operator + (node p,node q){
node c=p;
for(int i=1;i<=q.len;i++) c.len++,c.a[c.len]=q.a[i];
return c;
}
inline void out(node x){
for(int i=1;i<=x.len;i++) printf("%lld ",x.a[i]);
puts("");
return ;
}
namespace sub1{
int sz[135];
node f[135][135];
inline void dfs(int u){
if(u>=n) return ;
dfs(u<<1);
dfs(u<<1|1);
for(int ww=0;ww<=k;ww++){
node mx1,mx2;
for(int i=1;i<=sz[u];i++) mx1.a[i]=0;
mx1.len=sz[u];mx2=mx1;
for(int x=0;x<=ww;x++){
mx1=max(mx1,min(f[u<<1][x]+f[u<<1|1][ww-x],f[u<<1|1][ww-x]+f[u<<1][x]));
if(ww-x>=w[u]) mx2=max(mx2,f[u<<1][x]+f[u<<1|1][ww-x-w[u]]);
}
f[u][ww]=max(mx1,mx2);
}
}
inline void work(){
k=min(k,n);
for(int i=n;i<2*n;i++){
for(int j=0;j<=k;j++) f[i][j]={1,{0,q[i]}};
int u=i>>1;
while(u) sz[u]++,u>>=1;
}
dfs(1);
node ans=f[1][0];
for(int i=1;i<=k;i++) ans=max(ans,f[1][i]);
out(ans);
return ;
}
}
namespace sub3{
bool mp[40];
inline node dfs(int u){
if(u>=n) return {1,{0,q[u]}};
node lf=dfs(u<<1);
node rt=dfs(u<<1|1);
if(mp[u]) return lf+rt;
else return min(lf+rt,rt+lf);
}
inline void work(){
node ans;
ans.len=n;
for(int i=1;i<=n;i++) ans.a[i]=i;
for(int s=0;s<(1<<(n-1));s++){
int ss=0;
memset(mp,0,sizeof(mp));
for(int i=1;i<n;i++)
if((s>>(i-1))&1) ss+=w[i],mp[i]=1;
if(ss<=k) ans=max(ans,dfs(1));
}
out(ans);
return ;
}
}
namespace sub4{
struct nod{int len,a[65];}f[135];
bool operator < (nod p,nod q){
int len=p.len;
for(int i=1;i<=len;i++)
if(p.a[i]!=q.a[i]) return p.a[i]<q.a[i];
return 0;
}
nod operator + (nod p,nod q){
nod c=p;
for(int i=1;i<=q.len;i++) c.len++,c.a[c.len]=q.a[i];
return c;
}
inline void out(nod x){
for(int i=1;i<=x.len;i++) printf("%lld ",x.a[i]);
puts("");
return ;
}
bool mp[135];
inline void upd(int u){
while(u){
if(mp[u]) f[u]=f[u<<1]+f[u<<1|1];
else f[u]=min(f[u<<1]+f[u<<1|1],f[u<<1|1]+f[u<<1]);
u>>=1;
}
return ;
}
inline nod dfs(int u){
if(u>=n) return f[u]={1,{0,q[u]}};
nod lf=dfs(u<<1);
nod rt=dfs(u<<1|1);
if(mp[u]) return f[u]=lf+rt;
else return f[u]=min(lf+rt,rt+lf);
}
inline void work(){
nod ans;
ans.len=n;
for(int i=1;i<=n;i++) ans.a[i]=i;
mt19937 rnd(time(NULL));
int mxn=20000000/n,cst=0;
dfs(1);
while(mxn--){
int p=rnd()%n+1;
if(mp[p]){mp[p]=0,cst-=w[p];mxn++;upd(p);continue;}
if(cst+w[p]<=k){
cst+=w[p];
mp[p]=1;
upd(p);
ans=max(ans,f[1]);
}
else mxn++;
}
out(ans);
return ;
}
}
signed main(){
in(T);
while(T--){
in(m),in(k);
n=1<<m;
for(int i=1;i<n;i++) in(w[i]);
for(int i=1;i<=n;i++) in(q[i-1+n]);
bool ok=1;
for(int i=n;i<2*n;i++) ok&=(q[i]==2*n-i);
if(ok){sub2::work();continue;}
ok=1;
for(int i=1;i<n;i++) ok&=(w[i]==1);
if(ok){sub1::work();continue;}
if(m<=4){sub3::work();continue;}
sub4::work();
}
return 0;
}