제출 #228276

#제출 시각아이디문제언어결과실행 시간메모리
228276urd05시간이 돈 (balkan11_timeismoney)C++14
75 / 100
2088 ms1576 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
 
int n,m;
 
struct Edge {
    int s,e,t,c;
};
 
Edge edge[10000];
int one,two;
int cnt=0;
 
bool comp(Edge a,Edge b) {
    return one*a.t+two*a.c<one*b.t+two*b.c;
}
 
int opt1=-1;
int opt2=-1;
long long ret1=1e6;
long long ret2=1e6;
 
int p[200];
 
int find(int a) {
    cnt++;
    if (p[a]<0) {
        return a;
    }
    p[a]=find(p[a]);
    return p[a];
}
 
void merge(int a,int b) {
    cnt++;
    a=find(a);
    b=find(b);
    if (a==b) {
        return;
    }
    p[b]=a;
}
 
void solve(int x1,int y1,int x2,int y2) {
    if (x1==x2&&y1==y2) {
        return;
    }
    one=y1-y2;
    two=x2-x1;
    int x=0;
    int y=0;
    sort(edge,edge+m,comp);
    memset(p,-1,sizeof(p));
    for(int i=0;i<m;i++) {
        cnt++;
        if (find(edge[i].s)!=find(edge[i].e)) {
            x+=edge[i].t;
            y+=edge[i].c;
            merge(edge[i].s,edge[i].e);
        }
    }
    if ((long long)x*(long long)y<ret1*ret2) {
        ret1=x;
        ret2=y;
        opt1=y1-y2;
        opt2=x2-x1;
    }
    if ((x!=x2)||(y!=y2))
        solve(x1,y1,x,y);
    if (x!=x1||y!=y1)
        solve(x,y,x2,y2);
}
 
main(void) {
    //mt19937 rd = mt19937((unsigned)chrono::steady_clock::now().time_since_epoch().count());
    //uniform_int_distribution<int> ran(0, 2147483647);
    scanf("%d %d\n",&n,&m);
    for(int i=0;i<m;i++) {
        scanf("%d %d %d %d\n",&edge[i].s,&edge[i].e,&edge[i].t,&edge[i].c);
        //edge[i].s=ran(rd)%n;
        //edge[i].e=ran(rd)%n;
        //edge[i].t=ran(rd)%256;
        //edge[i].c=ran(rd)%256;
    }
    one=300*n;
    two=1;
    int x1=0;
    int x2=0;
    int y1=0;
    int y2=0;
    sort(edge,edge+m,comp);
    memset(p,-1,sizeof(p));
    for(int i=0;i<m;i++) {
        if (find(edge[i].s)!=find(edge[i].e)) {
            x1+=edge[i].t;
            y1+=edge[i].c;
            merge(edge[i].s,edge[i].e);
        }
    }
    if (x1*(long long)y1<ret1*ret2) {
        ret1=x1;
        ret2=y1;
        opt1=1;
        opt2=0;
    }
    one=1;
    two=300*n;
    sort(edge,edge+m,comp);
    memset(p,-1,sizeof(p));
    for(int i=0;i<m;i++) {
        if (find(edge[i].s)!=find(edge[i].e)) {
            x2+=edge[i].t;
            y2+=edge[i].c;
            merge(edge[i].s,edge[i].e);
        }
    }
    if (x2*(long long)y2<ret1*ret2) {
        ret1=x2;
        ret2=y2;
        opt1=0;
        opt2=1;
    }
    solve(x1,y1,x2,y2);
    printf("%d %d\n",ret1,ret2);
    one=opt1;
    two=opt2;
    sort(edge,edge+m,comp);
    memset(p,-1,sizeof(p));
    for(int i=0;i<m;i++) {
        if (find(edge[i].s)!=find(edge[i].e)) {
            merge(edge[i].s,edge[i].e);
            printf("%d %d\n",edge[i].s,edge[i].e);
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

timeismoney.cpp:76:10: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(void) {
          ^
timeismoney.cpp: In function 'int main()':
timeismoney.cpp:79:26: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat=]
     scanf("%d %d\n",&n,&m);
                     ~~   ^
timeismoney.cpp:79:26: warning: format '%d' expects argument of type 'int*', but argument 3 has type 'long long int*' [-Wformat=]
timeismoney.cpp:81:74: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat=]
         scanf("%d %d %d %d\n",&edge[i].s,&edge[i].e,&edge[i].t,&edge[i].c);
                               ~~~~~~~~~~                                 ^
timeismoney.cpp:81:74: warning: format '%d' expects argument of type 'int*', but argument 3 has type 'long long int*' [-Wformat=]
timeismoney.cpp:81:74: warning: format '%d' expects argument of type 'int*', but argument 4 has type 'long long int*' [-Wformat=]
timeismoney.cpp:81:74: warning: format '%d' expects argument of type 'int*', but argument 5 has type 'long long int*' [-Wformat=]
timeismoney.cpp:126:31: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
     printf("%d %d\n",ret1,ret2);
                               ^
timeismoney.cpp:126:31: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long long int' [-Wformat=]
timeismoney.cpp:134:49: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
             printf("%d %d\n",edge[i].s,edge[i].e);
                              ~~~~~~~~~          ^
timeismoney.cpp:134:49: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long long int' [-Wformat=]
timeismoney.cpp:79:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d\n",&n,&m);
     ~~~~~^~~~~~~~~~~~~~~~~
timeismoney.cpp:81:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d %d\n",&edge[i].s,&edge[i].e,&edge[i].t,&edge[i].c);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...