Submission #1001194

# Submission time Handle Problem Language Result Execution time Memory
1001194 2024-06-18T16:53:46 Z andrei_iorgulescu timeismoney (balkan11_timeismoney) C++14
70 / 100
2000 ms 3100 KB
#include <bits/stdc++.h>

using namespace std;

#define int long long

struct edge
{
    int x,y,t,c;
};

int n,m;
edge a[10005];
vector<pair<int,pair<int,int>>> e;
map<pair<int,int>,int> timp, cost, idx;

struct sol
{
    vector<bool> use;
    int v,sumtime,summoney;
};

sol ans;

int tt[205],sz[205];

int rep(int x)
{
    while (x != tt[x])
        x = tt[x];
    return x;
}

void join(int x,int y)
{
    x = rep(x);
    y = rep(y);
    if (x == y)
        return;
    if (sz[x] < sz[y])
        swap(x,y);
    sz[x] += sz[y];
    tt[y] = x;
}

signed main()
{
    ans.v = ans.sumtime = 1e9;
    ans.summoney = 1;
    cin >> n >> m;
    ans.use.resize(m + 1);
    for (int i = 1; i <= m; i++)
    {
        cin >> a[i].x >> a[i].y >> a[i].t >> a[i].c;
        timp[ {a[i].x,a[i].y}] = a[i].t;
        cost[ {a[i].x,a[i].y}] = a[i].c;
        idx[ {a[i].x,a[i].y}] = i;
    }
    for (int r1 = 1; r1 <= 256; r1++)
    {
        for (int r2 = 1; r2 <= 256; r2++)
        {
            if (r1 >= 20 and r2 >= 20 and (r1 + r2) % 20 != 0)
                continue;
            e.clear();
            for (int i = 1; i <= m; i++)
            {
                int x = a[i].x,y = a[i].y;
                int cost = a[i].c * r1 + a[i].t * r2;
                e.push_back({cost,{x,y}});
            }
            sort(e.begin(),e.end());
            for (int i = 0; i < n; i++)
                tt[i] = i,sz[i] = 1;
            vector<pair<int,int>> luate;
            for (auto it : e)
            {
                if (rep(it.second.first) != rep(it.second.second))
                {
                    luate.push_back(it.second);
                    join(it.second.first,it.second.second);
                }
            }
            sol cur;
            cur.use.resize(m + 1);
            cur.summoney = cur.sumtime = 0;
            for (auto it : luate)
            {
                cur.use[idx[it]] = true;
                cur.sumtime += timp[it];
                cur.summoney += cost[it];
            }
            cur.v = cur.sumtime * cur.summoney;
            if (cur.v < ans.v)
                ans = cur;
        }
    }
    cout << ans.sumtime << ' ' << ans.summoney << '\n';
    for (int i = 1; i <= m; i++)
        if (ans.use[i])
            cout << a[i].x << ' ' << a[i].y << '\n';
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 183 ms 344 KB Output is correct
2 Correct 8 ms 348 KB Output is correct
3 Correct 17 ms 448 KB Output is correct
4 Correct 48 ms 440 KB Output is correct
5 Correct 186 ms 348 KB Output is correct
6 Correct 216 ms 348 KB Output is correct
7 Correct 1256 ms 860 KB Output is correct
8 Execution timed out 2058 ms 3100 KB Time limit exceeded
9 Correct 8 ms 348 KB Output is correct
10 Correct 19 ms 344 KB Output is correct
11 Correct 15 ms 348 KB Output is correct
12 Correct 62 ms 348 KB Output is correct
13 Correct 56 ms 348 KB Output is correct
14 Correct 370 ms 348 KB Output is correct
15 Correct 355 ms 512 KB Output is correct
16 Execution timed out 2045 ms 856 KB Time limit exceeded
17 Execution timed out 2023 ms 956 KB Time limit exceeded
18 Execution timed out 2023 ms 856 KB Time limit exceeded
19 Execution timed out 2029 ms 3096 KB Time limit exceeded
20 Execution timed out 2067 ms 3100 KB Time limit exceeded