Submission #503652

# Submission time Handle Problem Language Result Execution time Memory
503652 2022-01-08T14:15:14 Z XII timeismoney (balkan11_timeismoney) C++17
40 / 100
54 ms 588 KB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define fi first
#define se second
#define mp make_pair
#define eb emplace_back
#define ALL(x) (x).begin(), (x).end()

#define FOR(i, a, b) for(int i = (a); i < (b); ++i)
#define FORU(i, a, b) for(int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for(int i = (a); i >= (b); --i)

#define IOS cin.tie(0)->sync_with_stdio(false);
#define PROB "timeismoney_TernarySearch"
void Fi(){
    if(fopen(PROB".inp", "r")){
        freopen(PROB".inp", "r", stdin);
        freopen(PROB".out", "w", stdout);
    }
}

const int N = 200 + 1;
const int M = 10000 + 1;
const double MAX = 1e5;

struct edge{
    int u, v, t, c;
    ll w;
    const bool operator<(const edge &ot){
        return w < ot.w;
    }
};
vector<edge> ed;

using pi = pair<int, int>;
using pl = pair<ll, ll>;
int n, m;
pl ans;
pi mst[N];
int cnt;

int par[N];
void init(){
    FOR(i, 0, n) par[i] = -1;
}
int root(int v){
    return (par[v] < 0) ? v : par[v] = root(par[v]);
}
bool join(int x, int y){
    if((x = root(x)) == (y = root(y))) return false;
    if(-par[x] < -par[y]) swap(x, y);
    par[x] += par[y];
    par[y] = x;
    return true;
}

ll check(const double &X){
    for(edge &x: ed){
        x.w = (x.t * X + x.c * (MAX - X));
    }
    sort(ALL(ed));
    cnt = 0;
    ans = {0, 0};
    init();
    for(edge x: ed){
        if(join(x.u, x.v)){
            ans.fi += x.t;
            ans.se += x.c;
            mst[++cnt] = {x.u, x.v};
        }
    }
    return ans.fi * ans.se;
}

int main(){
    IOS;
    Fi();
    cin >> n >> m;
    ed.resize(m);
    for(edge &x: ed) cin >> x.u >> x.v >> x.t >> x.c;
    double l = 0, h = MAX;
    for(int step = 1; step <= 100; ++step){
        double m1 = l + (h - l) / 3;
        double m2 = h - (h - l) / 3;
        if(check(m1) > check(m2)) h = m2;
        else l = m1;
    }
    check(l);
    cout << ans.fi << " " << ans.se << "\n";
    FOR(i, 1, n) cout << mst[i].fi << " " << mst[i].se << "\n";
    return 0;
}

Compilation message

timeismoney.cpp: In function 'void Fi()':
timeismoney.cpp:20:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         freopen(PROB".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
timeismoney.cpp:21:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |         freopen(PROB".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Correct 2 ms 204 KB Output is correct
6 Correct 2 ms 204 KB Output is correct
7 Correct 11 ms 360 KB Output is correct
8 Correct 47 ms 460 KB Output is correct
9 Incorrect 0 ms 204 KB Output isn't correct
10 Incorrect 0 ms 204 KB Output isn't correct
11 Incorrect 0 ms 204 KB Output isn't correct
12 Incorrect 1 ms 204 KB Output isn't correct
13 Incorrect 1 ms 204 KB Output isn't correct
14 Incorrect 2 ms 332 KB Output isn't correct
15 Incorrect 2 ms 204 KB Output isn't correct
16 Incorrect 9 ms 364 KB Output isn't correct
17 Incorrect 9 ms 332 KB Output isn't correct
18 Incorrect 9 ms 364 KB Output isn't correct
19 Incorrect 54 ms 460 KB Output isn't correct
20 Incorrect 51 ms 588 KB Output isn't correct