제출 #223309

#제출 시각아이디문제언어결과실행 시간메모리
223309rainyPutovanje (COCI20_putovanje)C++17
20 / 110
1096 ms54508 KiB
#include<bits/stdc++.h>
#define INF 2123456789
#define BINF 9123456789123456789
#define MAXN 200005
//#define DB
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
typedef pair<ll,ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<ii> vii;
typedef vector<pl> vpl;
int N,A,B,C1,C2;
map<ii,int> sp;
map<ii,int> mp;
map<ii,int> nt;
map<ii,int> tt;
vii el;
vi al[MAXN];
int p[MAXN][25],d[MAXN];

void root(int v,int par){
    p[v][0]=par;
    if(par==-1)d[v]=0;
    else d[v]=d[par]+1;
    for(int i:al[v]){
        if(i!=par)root(i,v);
    }
}

int lca(int a,int b){
    if(d[a]<d[b])swap(a,b);
    for(int k=log2(N);k>=0;k--)
        if(p[a][k]!=-1&&d[p[a][k]]>=d[b])
            a=p[a][k];
    if(a==b)return a;
    for(int k=log2(N);k>=0;k--){
        if(p[a][k]!=p[b][k])a=p[a][k],b=p[b][k];
    }
    return p[a][0];
}

int main(){
    scanf("%d",&N);
    for(int i=0;i<N-1;i++){
        scanf("%d%d%d%d",&A,&B,&C1,&C2);
        A--;B--;
        ii p1=ii(A,B),p2=ii(B,A);
        el.pb(ii(A,B));
        sp[p1]=sp[p2]=C1;
        mp[p1]=mp[p2]=C2;
        tt[p1]=tt[p2]=0;
        al[A].pb(B);al[B].pb(A);
    }
    root(0,-1);
    for(int k=1;k<23;k++){
        for(int i=0;i<N;i++){
            if(p[i][k-1]!=-1)
                p[i][k]=p[p[i][k-1]][k-1];
            else p[i][k]=-1;
        }
    }
    for(int i=0;i<N-1;i++){
        int aa=i,bb=i+1;
        #ifdef DB
        printf("%d -> %d\n",aa+1,bb+1);
        #endif // DB
        int anc=lca(aa,bb);
        while(aa!=anc){
            tt[ii(aa,p[aa][0])]++;
            #ifdef DB
            printf("%d-%d\n",aa+1,p[aa][0]+1);
            #endif // DB
            aa=p[aa][0];
        }
        while(bb!=anc){
            tt[ii(bb,p[bb][0])]++;
            #ifdef DB
            printf("%d-%d\n",bb+1,p[bb][0]+1);
            #endif // DB
            bb=p[bb][0];
        }
    }
    int ans=0;
    for(ii i:el){
        ii j=ii(i.second,i.first);
        int k=tt[i]+tt[j];
        if(k>0)ans+=min(k*sp[i],mp[i]);
        #ifdef DB
        printf("%d->%d for %d time(s) costs $%d\n",i.first,i.second,k,ans);
        #endif
    }
    printf("%d\n",ans);
    return 0;
}

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

putovanje.cpp: In function 'int main()':
putovanje.cpp:46:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&N);
     ~~~~~^~~~~~~~~
putovanje.cpp:48:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d%d",&A,&B,&C1,&C2);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...