求助,本地与luoguIDE不太一样
查看原帖
求助,本地与luoguIDE不太一样
122757
PrefixAMS楼主2021/5/2 16:47

第一组数据是样例,本地跑的飞快,luoguIDETLE

求助大佬

#include<bits/stdc++.h>
using namespace std;
class node{
	public :
		int mp[9000008];
		node() {
			for(int i=1;i<9000007;i++) mp[i]=-4000000000;
		}
		int hash(int x) {
			int ghj=x%9000007;
			while(mp[ghj]!=-4000000000 and mp[ghj]!=x) {
				ghj++;
				if(ghj>=9000007) ghj=0;
			}
			mp[ghj]=x;
			return ghj;
		}
}ghj;
#define ll int 
ll head[1000010],to[1000010],nxt[1000010],total,mid,h[21],ans,n;
bool net[2000][2000];
void add_edge(int u,int v) {
	total++;
	to[total]=v;
	nxt[total]=head[u];
	head[u]=total;
}
ll read() {
    ll s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') {
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
void dfs1(int now,int st,int suma,int sumb) {
	if(now==mid+1) {
		if(suma<sumb) return ;
		int k=ghj.hash(suma-sumb);
		add_edge(k,st);
		return;
	}
	dfs1(now+1,st<<1,suma,sumb);
	dfs1(now+1,(st<<1)+1,suma+h[now],sumb);
	dfs1(now+1,(st<<1)+1,suma,sumb+h[now]);
}
void dfs2(int now,int st,int suma,int sumb) {
	if(now==mid) {
		if(suma<sumb) return ;
		int k=ghj.hash(suma-sumb);
		for(int e=head[k];e;e=nxt[e]) {
			if(!net[k][to[e]]) {
				net[k][to[e]]=true;
				ans++;
			}
		}
		return;
	}
	dfs2(now-1,st<<1,suma,sumb);
	dfs2(now-1,(st<<1)+1,suma+h[now],sumb);
	dfs2(now-1,(st<<1)+1,suma,sumb+h[now]);
}
int main() {
//	freopen("subset.in","r",stdin);
//	freopen("subset.out","w",stdout);
	n=read();
	mid=n/2;
	for(int i=1;i<=n;i++) h[i]=read();
	dfs1(1,0,0,0);
	dfs2(n,0,0,0);
	cout<<ans-1;
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
2021/5/2 16:47
加载中...