Cod sursa(job #1336357)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 7 februarie 2015 17:19:02
Problema Cutii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#define MAXN 6000
int a[MAXN], b[MAXN], c[MAXN], n;
long long d[MAXN];
inline int tata(int p){
    return (p-1)/2;
}
inline int fiust(int p){
    return 2*p+1;
}
inline int fiudr(int p){
    return 2*p+2;
}
inline void swap(int x, int y){
    int aux=a[x];
    a[x]=a[y];
    a[y]=aux;
    aux=b[x];
    b[x]=b[y];
    b[y]=aux;
    aux=c[x];
    c[x]=c[y];
    c[y]=aux;
}
inline void coborare(int p){
    int f=1, q;
    while((f==1)&&(fiust(p)<n)){
        q=fiust(p);
        if((fiudr(p)<n)&&(a[fiudr(p)]>a[q])){
            q=fiudr(p);
        }
        if(a[q]>a[p]){
            swap(p, q);
            p=q;
        }else{
            f=0;
        }
    }
}
inline void heapify(){
    int i;
    for(i=tata(n-1); i>=0; i--){
        coborare(i);
    }
}
inline void heapSort(){
    int cn=n;
    while(n>1){
        n--;
        swap(0, n);
        coborare(0);
    }
    n=cn;
}
int main(){
    int gogu, i, x, y, z, k, j, aux, p, q, r;
    long long ans, max;
    FILE *fin, *fout;
    fin=fopen("cutii.in", "r");
    fout=fopen("cutii.out", "w");
    fscanf(fin, "%d", &gogu);
    n=0;
    for(i=0; i<gogu; i++){
        fscanf(fin, "%d%d%d", &p, &q, &r);
        if((r>=p)&&(r>=q)){
            z=r;
            if(p<=q){
                x=p;
                y=q;
            }else{
                x=q;
                y=p;
            }
        }else if(r>=p){
            z=q;
            x=p;
            y=r;
        }else if(r>=q){
            z=p;
            x=q;
            y=r;
        }else if(p>=q){
            z=p;
            x=r;
            y=q;
        }else{
            z=q;
            x=r;
            y=p;
        }
        a[n]=x; b[n]=y; c[n]=z; n++;
        a[n]=x; b[n]=z; c[n]=y; n++;
        a[n]=y; b[n]=z; c[n]=x; n++;
    }
    heapify();
    heapSort();
    k=0;
    ans=0;
    for(i=0; i<n; i++){
        if(a[i]!=a[k]){
            k=i;
        }
        max=0;
        for(j=0; j<k; j++){
            if((b[i]>b[j])&&(max<d[j])){
                max=d[j];
            }
        }
        d[i]=c[i]+max;
        if(ans<d[i]){
            ans=d[i];
        }
    }
    fprintf(fout, "%lld\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}