折半搜索WA38pts求调
查看原帖
折半搜索WA38pts求调
933802
ICU152_lowa_IS8楼主2024/7/5 01:47
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100005];
int ans1[1000005],p1;
int ans2[1000005],p2; 
int n;
void dfs1(int step,int cnt){
	if(step==n/2+1){
		ans1[++p1]=cnt;
		return;
	}
	dfs1(step+1,cnt);
	dfs1(step+1,cnt+a[step]);
	dfs1(step+1,cnt-a[step]); 
}
void dfs2(int step,int cnt){
	if(step==n+1){
		ans2[++p2]=cnt;
		return;
	}
	dfs2(step+1,cnt);
	dfs2(step+1,cnt+a[step]);
	dfs2(step+1,cnt-a[step]); 
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs1(1,0);
	dfs2(n/2+1,0);
	int ans=0;
//	sort(ans1+1,ans1+p1+1);
	sort(ans2+1,ans2+p2+1);
//	for(int i=1;i<=p1;i++){
//		cout<<ans1[i]<<" ";
//	}
//	cout<<endl;
//	for(int i=1;i<=p2;i++){
//		cout<<ans2[i]<<" ";
//	}
//	cout<<endl;
	for(int i=1;i<=p1;i++){
		int l=lower_bound(ans2+1,ans2+p2+1,-ans1[i])-ans2;
		int r=upper_bound(ans2+1,ans2+p2+1,-ans1[i])-ans2;
		ans+=r-l;
	}
	cout<<(ans-1)/2;//解集为空会选一次,其他的解会算两次
	return 0;
}
/*
20
30
4
36
14
20
18
6
26
40
14
28
10
30
38
20
20
18
36
32
22
*/
2024/7/5 01:47
加载中...