Cod sursa(job #2922538)

Utilizator 100pCiornei Stefan 100p Data 8 septembrie 2022 20:19:40
Problema Lapte Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <bits/stdc++.h>
#define int long long
#define FILES freopen("lapte.in","r",stdin);\
            freopen("lapte.out","w",stdout);
using namespace std;
struct bottle
{
    int ma, mb, index;
};
int n,l,ansA[205],ansB[205];
vector<bottle> v;
bool cmp(bottle a,bottle b)
{
    return a.mb < b.mb;
}
signed main()
{
    FILES
    cin >> n >> l;
    for(int i = 1; i <= n; ++i)
    {
        int a,b;
        cin >> a >> b;
        v.push_back({a,b,i});
    }
    sort(v.begin(),v.end(),cmp);
    int st = 0,dr = 1e9, ans = 0;
    while(st <= dr)
    {
        int mid = (st + dr) >> 1;
        int s1 = 0,s2 = 0;
        for(int i = 0; i < v.size(); ++i)
            s1 += mid / v[i].ma;
        bool ok = 1;
        for(int i = 0; i < v.size() && (s1 < l || s2 < l); ++i)
        {

            s2 += mid / v[i].mb;
            s1 -= mid / v[i].ma;
            int p1 = mid / v[i].mb;
            int p2 = mid / v[i].ma;
            if(s1 < l && s2 < l)
            {
                ok = 0;
                break;
            }
            int timp = mid - p1 * v[i].mb + mid - p2 * v[i].ma;
            if(s1 < l && s2 >= l)
            {
                int r = v[i].ma / v[i].mb + 1;
                if(v[i].ma % v[i].mb == 0) r--;
                for(int j = s2; j >= l; --j)
                {
                    int h = timp + (s2 - j) * v[i].mb;
                    if(s1 + h / v[i].ma >= l)
                    {
                        s1 += h / v[i].ma;
                        int l = s2 - j;
                        s2 -= l;
                        break;
                    }
                }
                if(s1 < l || s2 < l)
                {
                    ok = 0;
                    break;
                }
                break;
            }
        }
        if(ok) dr = mid - 1, ans = mid;
        else st = mid + 1;
    }
    cout << ans << '\n';
    int s1 = 0,s2 = 0;
    for(int i = 0; i < v.size(); ++i)
        ansA[v[i].index] = ans / v[i].ma, s1 += ans / v[i].ma;
    for(int i = 0; i < v.size() && (s1 < l || s2 < l); ++i)
    {
        ansA[v[i].index] = 0;
        ansB[v[i].index] = ans / v[i].mb;
        int p1 = ans / v[i].mb;
        int p2 = ans / v[i].ma;
        s2 += ans / v[i].mb;
        s1 -= ans / v[i].ma;
        int timp = ans - p1 * v[i].mb + ans - p2 * v[i].ma;
        if(s1 < l && s2 >= l)
        {
            int r = v[i].ma / v[i].mb + 1;
            if(v[i].ma % v[i].mb == 0) r--;

            for(int j = s2; j >= l; --j)
            {
                int h = timp + (s2 - j) * v[i].mb;
                if(s1 + h / v[i].ma >= l)
                {
                    s1 += h / v[i].ma;
                    ansA[v[i].index] += h / v[i].ma;

                    int l = s2 - j;
                    s2 -= l;
                    ansB[v[i].index] -= l;
                    break;
                }
            }
            break;
        }
    }
    for(int i = 1; i <= n; ++i)
        cout << ansA[i] << ' '<< ansB[i] << '\n';

}