91分求助优化
查看原帖
91分求助优化
542009
ThisIsLu楼主2023/11/12 16:53

用的状态压缩,吸口氧91,不吸87。

无氧评测记录

有氧评测记录

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[40],ans;
bool vis[5000000];
unordered_map<int,int> ma;
vector<int> f[60000];
int cnt;
void work(bool t,int l,int r){
	for(int i=0;i<pow(3,r-l+1);i++){
		int now=0,pow3=1,sum=0;
		for(int j=l;j<=r;j++){
			if((i/pow3)%3==1){
				sum+=a[j];
				now=now|(1<<j);
			}
			else if((i/pow3)%3==2){
				sum-=a[j];
				now=now|(1<<j);
			}
			pow3*=3;
		}
		if(t){
			for(int i=0;i<f[ma[sum]].size();i++){
				if(!vis[now|f[ma[sum]][i]]){
					ans++;
					vis[now|f[ma[sum]][i]]=true;
				}
			}
		}
		else{
			if(ma[sum]==0) ma[sum]=++cnt;
			f[ma[sum]].push_back(now);
		}
	}
}
signed main(){
	ans=0;
	cnt=0;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	memset(vis,false,sizeof(vis));
	work(0,0,n/2-1);
	work(1,n/2,n-1);
	cout<<ans-1;
	return 0;
}
2023/11/12 16:53
加载中...