Cod sursa(job #2815891)

Utilizator MateiMorticiMatei Mortici MateiMortici Data 10 decembrie 2021 15:59:53
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include<algorithm>

using namespace std;

ifstream cin("points2.in");
ofstream cout("points2.out");

long long v[37],sub1[263000];

int main()
{
    int n,i,j,nr,st,dr,sol,cn,mijl;
    long long T,s,rez;
    cin>>n>>T;
    cn=n;
    n=n/2;
    for(i=1;i<=n;i++)
        cin>>v[i];
    rez=0;
    for(i=1;i<=(1<<n)-1;i++)
    {
        s=0;
        for(j=0;j<n;j++)
            if((i>>j)&1==1)
                s+=v[j+1];
        sub1[i]=s;
        if(s>=T)
            rez++;
    }
    nr=(1<<n)-1;
    sort(sub1+1, sub1+nr);
    n=cn-n;
    for(i=1;i<=n;i++)
        cin>>v[i];

    for(i=1;i<=(1<<n)-1;i++)
    {
        s=0;
        for(j=0;j<n;j++)
            if((i>>j)&1==1)
                s+=v[j+1];
        if(s>=T)
            rez++;
        st=1;
        dr=nr;
        sol=-1;
        while(st<=dr)
        {
            mijl=(st+dr)/2;
            if(s+sub1[mijl]>=T)
            {
                sol=mijl;
                dr=mijl-1;
            }
            else
                st=mijl+1;
        }
        if(sol!=-1)
            rez+=(nr-sol+1);
    }

    cout<<rez;


    return 0;
}