关于联合省选编译问题
  • 板块学术版
  • 楼主Reunite
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/3/3 17:08
  • 上次更新2024/3/3 19:20:28
查看原帖
关于联合省选编译问题
377760
Reunite楼主2024/3/3 17:08

以下代码在云斗上会 CE,但是在洛谷 c++14 的 IDE ,以及我赛时 "g++ maze.cpp -std=c++14 -o maze.exe" 都没有 CE,会寄吗。

主要就是,time(NULL)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;
}
2024/3/3 17:08
加载中...