为什么加上int会re
查看原帖
为什么加上int会re
671857
wang_si_yu楼主2025/8/1 16:37

rt

第35行int如不去掉,那就只有24分(其它全RE)

#include<bits/stdc++.h>
using namespace std;
int n,a[25];
vector<pair<int,int> >sum1,sum2;
int ans,mid;
map<int,vector<int> > lmp,rmp;
void dfs1(int l,int r,int S,int m){
	if(l>=r){
		sum1.push_back({S,m});
		return;
	}
	dfs1(l+1,r,S+a[l],m|(1<<(l-1)));
	dfs1(l+1,r,S-a[l],m|(1<<(l-1)));
	dfs1(l+1,r,S,m);
}
void dfs2(int l,int r,int S,int m){
	if(l>=r){
		sum2.push_back({S,m});
		return;
	}
	dfs2(l+1,r,S+a[l],m|(1<<(l-1-mid)));
	dfs2(l+1,r,S-a[l],m|(1<<(l-1-mid)));
	dfs2(l+1,r,S,m);
}
void pr(int a,int sum[]){
	for(int i=1;i<=a;i++)cout<<sum[i]<<" ";
	cout<<endl<<a<<endl;
}
signed main(){
	//freopen("P3067_2.in","r",stdin);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int mid=n>>1;
	dfs1(1,mid+1,0,0);
	dfs2(mid+1,n+1,0,0);
	int s;
	for(auto &v:sum1){
        lmp[v.first].push_back(v.second);
    }
    for(auto &v:sum2){
        rmp[v.first].push_back(v.second);
    }
    bitset<1<<20> vis;
    for(auto &v:lmp){
        int p=v.first;
        auto &lm=v.second;
        int tp=-p;
        if(rmp.find(tp)!=rmp.end()){
            auto &rm=rmp[tp];
            for(auto lk:lm){
                for(auto rk:rm){
                    int tot=lk|(rk<<mid);
                    vis[tot]=1;
                }
            }
        }
    }
    //pr(cnt1,sum1);
    //pr(cnt2,sum2);
    ans=vis.count();
    if(vis[0]) ans--;
    cout<<ans;
	return 0;
}
2025/8/1 16:37
加载中...