蒟蒻求助莫名RE
查看原帖
蒟蒻求助莫名RE
161748
ssilrrr楼主2022/11/23 21:00

rt,找了半天没发现问题。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n;
const int N=50;
int a[N];
struct node{
    int opt;
    int state;
};
vector<node> L,R;
void dfs(int l,int r,int opt,int stat,vector<node>* addin){
    if(l>r){
        addin->push_back({opt,stat});
        return;
    }
    dfs(l+1,r,opt+a[l],stat|(1<<(l-1)),addin);
    dfs(l+1,r,opt-a[l],stat|(1<<(l-1)),addin);
    dfs(l+1,r,opt,stat,addin);
}
int vis[1<<21],ans;
signed main(){
    cin>>n;
    rep(i,1,n)cin>>a[i];
    dfs(1,(1+n)>>1,0,0,&L);
    dfs(((1+n)>>1)+1,n,0,0,&R);
    sort(L.begin(),L.end(),[](node a,node b){return a.opt<b.opt;});
    sort(R.begin(),R.end(),[](node a,node b){return a.opt>b.opt;});
    int l=0,r=0;
    while(l<L.size()&&r<R.size()){
        while(L[l].opt+R[r].opt>0)r++;
        int ps=r;
        while(r<R.size()&&L[l].opt+R[r].opt==0){
            if(!vis[L[l].state|R[r].state]){
                vis[L[l].state|R[r].state]=1;ans++;
            }
            r++;
        }
        if(l<L.size()&&L[l].opt==L[l+1].opt)r=ps;
        l++;
    }cout<<ans-1<<endl;
}
2022/11/23 21:00
加载中...