Cod sursa(job #163340)

Utilizator firewizardLucian Dobre firewizard Data 21 martie 2008 23:26:14
Problema Heavy metal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <stdlib.h>
long i,n,y[100000],x[100000],sol[100000],ind[100000],j,s[100000],max=-320000,nr;

int comp(const void * n1 ,const void * n2){
    return x[*((long*)n1)]-x[*((long*)n2)];
}

int seg(int x1,int y1,int x2,int y2)
{
 if((x1<x2&&x2<y1)|(x1<y2&&y2<y1)|(x2<x1&&x1<<y2)|(x2<y1&&y1<y2))
 return 0;
 else return 1;
}

int main ()
{
    freopen("heavymetal.in","r",stdin);
    freopen("heavymetal.out","w",stdout);
    //citire
    scanf("%ld\n",&n);
    for(i=1;i<=n;i++)
    {scanf("%ld %ld\n",&x[i],&y[i]);ind[i]=i;sol[i]=1;s[i]=y[i]-x[i];}
    //sortare
    qsort(ind+1,n,sizeof(long),comp);
    //program
    for(i=n-1;i>=1;i--)
    {
    for(j=i+1;j<=n;j++)
        if(sol[ind[i]]<sol[ind[j]]+1&&
           s[ind[j]]+y[ind[i]]-x[ind[i]]>s[ind[i]]&&
           seg(x[ind[i]],y[ind[i]],x[ind[j]],y[ind[j]])
           )
        {
           sol[ind[i]]=sol[ind[j]]+1;
           s[ind[i]]=s[ind[j]]+y[ind[i]]-x[ind[i]];
        }
        if(sol[ind[i]]==0){sol[ind[i]]++;s[ind[i]]=y[ind[i]]-x[ind[i]];}
        if(s[ind[i]]>=max){max=s[ind[i]];nr=ind[i];}
    }
    for(i=1;i<=n;i++)
    printf("%ld %ld %ld %ld\n",x[ind[i]],y[ind[i]],sol[ind[i]],s[ind[i]]);
    max=max+y[nr]-x[nr];
    printf("%ld",max);
    fclose(stdin);
    fclose(stdout);
    return 0;   
}