这种折半搜索为什么错(代码26行
  • 板块学术版
  • 楼主Kniqht
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/20 20:50
  • 上次更新2023/11/2 12:26:02
查看原帖
这种折半搜索为什么错(代码26行
315205
Kniqht楼主2023/10/20 20:50

38ptsWA

思路就是,折半搜出两个集合可能的所有值。考虑若A1-B1=-(A2-B2),则A1+A2=B1+B2,所以记录A,B差值求方案数

之后由于若A,B互换造成答案翻倍,所以/2,但是考虑全是0的情况所以-1后/2
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=30,M=2e5+10;
int n,a[N],t[2];
ll p[2][M];
map<ll,ll> h;
void dfs(int now,int ed,ll A,ll B,int st){
	if(now>ed){
		p[st][++t[st]]=A-B;
		return;
	}
	dfs(now+1,ed,A+a[now],B,st);
	dfs(now+1,ed,A,B,st);
	dfs(now+1,ed,A,B+a[now],st);
}
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	dfs(1,n/2,0,0,0);dfs(n/2+1,n,0,0,1);
	ll ans=0;
	for(int i=1;i<=t[1];i++) h[p[1][i]]++;
	for(int i=1;i<=t[0];i++) ans+=h[-p[0][i]];
	printf("%lld",(ans-1)/2);
	return 0;
}
2023/10/20 20:50
加载中...