Cod sursa(job #3346877)

Utilizator Horia_haivasHaivas Horia Horia_haivas Data 15 martie 2026 12:56:03
Problema Ghiozdan Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
//#define int long long
#pragma pack(1)

using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int range_rng(int l, int r)
{
    return uniform_int_distribution<int>(l,r)(rng);
}

struct adono
{
    short int many;
    int weight;
};

short int v[20005];
short int f[205];
vector<adono> cate[205];
short int dp[75005];
short int newdp[75005];
deque<int> dq[205];
vector<short int> sol;

bool can_find(int obj, int w)
{
    int r,pas;
    r=-1;
    pas=(1<<16);
    while (pas)
    {
        if (r+pas<cate[obj].size() && cate[obj][r+pas].weight<=w)
            r+=pas;
        pas=pas/2;
    }
    if (r==-1)
        return 0;
    if (cate[obj][r].weight==w)
        return 1;
    else
        return 0;
}

int get_idx(int obj, int w)
{
    int r,pas;
    r=-1;
    pas=(1<<16);
    while (pas)
    {
        if (r+pas<cate[obj].size() && cate[obj][r+pas].weight<=w)
            r+=pas;
        pas=pas/2;
    }
    return r;
}

signed main()
{
    ///*
    ifstream fin("ghiozdan.in");
    ofstream fout("ghiozdan.out");
    //*/
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,g,i,j,mod,w,bigw,nush;
    fin >> n >> g;
    for (i=1;i<=n;i++)
    {
         fin >> v[i];
         f[v[i]]++;
    }
    dp[0]=0;
    for (w=1;w<=g;w++)
         dp[w]=n+1;
    for (i=1;i<=200;i++)
    {
         for (j=0;j<=i;j++)
              dq[j].clear();
         mod=-1;
         for (w=0;w<=g;w++)
         {
              mod++;
              if(mod==i)
                 mod=0;
              while (!dq[mod].empty() && ((w-dq[mod].front())/i)>f[i])
                     dq[mod].pop_front();
              while (!dq[mod].empty() && ((w-dq[mod].back())/i)+dp[dq[mod].back()]>dp[w])
                     dq[mod].pop_back();
              dq[mod].push_back(w);
              newdp[w]=dp[dq[mod].front()]+((w-dq[mod].front())/i);
              if (((w-dq[mod].front())/i)!=0)
              cate[i].push_back({((w-dq[mod].front())/i),w});
         }
         for (w=0;w<=g;w++)
              dp[w]=newdp[w];
    }
    for (w=g;w>=0;w--)
    {
         if (dp[w]!=n+1)
         {
             fout << w << " " << dp[w] << "\n";
             bigw=w;
             break;
         }
    }
    for (i=200;i>=1;i--)
    {
         if (can_find(i,bigw))
         {
             nush=get_idx(i,bigw);
             nush=cate[i][nush].many;
             for (j=1;j<=nush;j++)
                  sol.push_back(i);
             bigw-=i*nush;
         }
    }
    for (auto x : sol)
         fout << x << "\n";
    return 0;
}