답안 #682403

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
682403 2023-01-16T08:08:31 Z lam 시간이 돈 (balkan11_timeismoney) C++14
50 / 100
6 ms 952 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
#define ff first
#define ss second

const int maxn = 1e6 + 10;
int u[maxn],v[maxn],t[maxn],c[maxn],w[maxn],id[maxn],used[maxn];
int n,m;
int p[maxn],s[maxn];

void reset()
{
    for (int i=1; i<=n; i++) p[i]=i, s[i]=1;
}

int get(int x)
{
    return p[x]=(p[x]==x)?x:get(p[x]);
}

bool cmp(int x, int y)
{
    return w[x]<w[y];
}

bool hop(int x, int y)
{
    x=get(x); y=get(y);
    if (x==y) return 0;
    if (s[x]>s[y]) swap(x,y);
    s[y]+=s[x];
    p[x]=y;
    return 1;
}

ii mst(int T, int C)
{
//    cout<<T<<" +++ "<<C<<'\n';
    int g = __gcd(T,C);
    T/=g; C/=g;
    for (int i=1; i<=m; i++) w[i]=T*t[i]+C*c[i];
    sort(id+1,id+m+1,cmp);
    fill_n(used,m+1,0);
    ii ans={0,0};
    reset();
    for (int i=1; i<=m; i++)
    {
        if (hop(u[id[i]],v[id[i]]))
        {
//            cout<<u[id[i]]<<" = "<<v[id[i]]<<" !!!!!!!!!!!!\n";
            used[id[i]]=1;
            ans.ff+=t[id[i]];
            ans.ss+=c[id[i]];
        }
    }
    return ans;
}

bool straight(ii x, ii y, ii z)
{
    return x.ff*(y.ss-z.ss) + y.ff*(z.ss-x.ss) + z.ff*(x.ss-y.ss) <=0;
}

iii res;

void dnc(ii x, ii y)
{
    if (x==y) return;
//    cout<<x.ff<<','<<x.ss<<" : "<<y.ff<<','<<y.ss<<'\n';
    ii z = mst(x.ss-y.ss, y.ff-x.ff);
    res=min(res,{z.ff*z.ss,{x.ss-y.ss, y.ff-x.ff}});
    if (x==z||y==z||straight(x,y,z)) return;
    dnc(x,z); dnc(z,y);
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    cin>>n>>m;
    for (int i=1; i<=m; i++)
    {
        cin>>u[i]>>v[i]>>t[i]>>c[i];
        u[i]++; v[i]++;
    }
    for (int i=1; i<=m; i++) id[i]=i;
    ii x = mst(1,0); ii y=mst(0,1);
    res={x.ff*x.ss,{1,0}};
    res=min(res,{y.ff*y.ss,{0,1}});
    dnc(x,y);
    x = mst(res.ss.ff,res.ss.ss);
    cout<<x.ff<<' '<<x.ss<<'\n';
    for (int i=1; i<=m; i++)
    {
        if (used[i]) cout<<u[i]-1<<' '<<v[i]-1<<'\n';
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 2 ms 468 KB Output is correct
8 Correct 5 ms 852 KB Output is correct
9 Correct 0 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Incorrect 0 ms 340 KB Output isn't correct
12 Incorrect 0 ms 340 KB Output isn't correct
13 Incorrect 0 ms 340 KB Output isn't correct
14 Incorrect 1 ms 340 KB Output isn't correct
15 Incorrect 1 ms 340 KB Output isn't correct
16 Incorrect 2 ms 468 KB Output isn't correct
17 Incorrect 1 ms 468 KB Output isn't correct
18 Incorrect 2 ms 468 KB Output isn't correct
19 Incorrect 6 ms 852 KB Output isn't correct
20 Incorrect 6 ms 952 KB Output isn't correct