답안 #788480

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
788480 2023-07-20T09:18:16 Z AmirElarbi 시간이 돈 (balkan11_timeismoney) C++14
55 / 100
4 ms 340 KB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#define INF 1e9
#define ve vector
#define vi ve<int>
#define ii pair<int,int>
#define vii ve<ii>
#define pb push_back
#define fi first
#define se second
#define ll long long
using namespace __gnu_pbds;
using namespace std;
const int nax = 300+5;
const int kax = 25+5;
#include<bits/stdc++.h>
template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
int par[nax];
int findpar(int u){
    if(par[u] == u) return u;
    return par[u] = findpar(par[u]);
}
bool isSameSet(int u, int v){
    return (findpar(u) == findpar(v));
}
void unionSet(int u, int v){
    u = findpar(u), v = findpar(v);
    if(u == v) return;
    par[u] = v;
}
ll cross(ii a, ii b, ii c){
    return (b.fi-a.fi)*(c.se-b.se) - (c.fi-b.fi) * (b.se-a.se);
}   
vii cur;
ll curval;
int n,m, x[nax], y[nax], c[nax], t[nax];
ii MST(ve<ii> &edge){
    for (int i = 0; i < n; ++i)
    {
        par[i] = i;
    }
    sort(edge.begin(), edge.end());
    cur.clear();
    int smt = 0, smc = 0;
    for(auto v : edge){
        if(!isSameSet(x[v.se], y[v.se])){
            unionSet(x[v.se], y[v.se]);
            cur.pb({x[v.se], y[v.se]});
            smt += t[v.se], smc += c[v.se];
        }
    }
    curval = smt*1ll*smc;
    return {smt, smc};
}
int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 0; i < m; ++i)
    {
        cin >> x[i] >> y[i] >> t[i] >> c[i];
    }
    ve<ii> edge;
    for(int i = 0; i < m; i++) edge.pb({t[i], i});
    ii a = MST(edge);
    vii ans = cur;
    ii aff = a;
    ll ansval = curval;
    edge.clear(); 
    for(int i = 0; i < m; i++) edge.pb({c[i], i});
    ii b = MST(edge);
    if(ansval > curval){
        ansval = curval;
        ans = cur;
        aff = b;
    }
    queue<pair<ii,ii>> bfs;
    bfs.push({a,b});
    while(!bfs.empty()){
        ii a = bfs.front().fi, b = bfs.front().se;
        bfs.pop();
        edge.clear(); 
        for(int i = 0; i < m; i++) edge.pb({c[i]*(b.fi-a.fi)-t[i]*(b.se-a.se), i});
        ii p = MST(edge);
        if(ansval > curval){
            ansval = curval;
            ans = cur;
            aff = p;
        }
        if(cross(a,b,p) >= 0) continue;
        bfs.push({a,p});
        bfs.push({p,b});
    }
    cout << aff.fi << " " << aff.se << endl;
    for(auto x : ans){
        cout << x.fi << " " << x.se << endl;
    }

}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 0 ms 212 KB Output isn't correct
6 Correct 1 ms 212 KB Output is correct
7 Incorrect 1 ms 340 KB Output isn't correct
8 Incorrect 1 ms 212 KB Output isn't correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Incorrect 0 ms 212 KB Output isn't correct
15 Correct 4 ms 224 KB Output is correct
16 Incorrect 0 ms 212 KB Output isn't correct
17 Incorrect 0 ms 212 KB Output isn't correct
18 Incorrect 1 ms 212 KB Output isn't correct
19 Incorrect 1 ms 212 KB Output isn't correct
20 Incorrect 1 ms 212 KB Output isn't correct