Pagini recente » Cod sursa (job #2264332) | Cod sursa (job #2203563) | Cod sursa (job #760371) | Cod sursa (job #1883422) | Cod sursa (job #3346847)
#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
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);
}
short int v[20005];
short int f[205];
vector<pair<short int,short int>> 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].first<=w)
r+=pas;
pas=pas/2;
}
if (r==-1)
return 0;
if (cate[obj][r].first==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].first<=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,((w-dq[mod].front())/i)});
}
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].second;
for (j=1;j<=nush;j++)
sol.push_back(i);
bigw-=i*nush;
}
}
for (auto x : sol)
fout << x << "\n";
return 0;
}