Cod sursa(job #144705)

Utilizator testelatugelu testelatu testelatu Data 27 februarie 2008 21:21:51
Problema Carnati Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<stdio.h>
#define nmax 2000
#define max(a,b) ((a)>(b)?(a):(b))

long long a1[nmax];
long long a2[nmax];

long long alege(long st,long dr)
{

long long x1=a1[st];
long long x2=a2[st];

  while( st < dr ){   
    while( st < dr && a1[dr] >= x1 )--dr;  
      
     a1[st]=a1[dr];  
     a2[st]=a2[dr];  
       
    while( st < dr && a1[st] <= x1 )++st;  
         
     a1[dr]=a1[st];  
     a2[dr]=a2[st];  
               
     }  
 a1[st]=x1;          
 a2[st]=x2;          
           
         return st;
}

void quicksort(long long st,long long dr)
{
     
if( st< dr){
    long long m=alege(st,dr);
    quicksort(st,m);
    quicksort(m+1,dr);
     }
}

int main()
{
 freopen("carnati.in","r",stdin);
 freopen("carnati.out","w",stdout);
 
 long long k,valm;
 
    int n,i,j;
    
    scanf("%d%lld",&n,&k);
    
    for(i=1; i<=n; ++i)
    scanf("%lld%lld",&a1[i],&a2[i]);
    
    quicksort(1,n);
    
long long incr=0,aux,saux,s1,s2,solfin=0;    
    
 for(i=1; i<=n; ++i){
  
     valm=a2[i];
     aux=(a1[i+1]-a1[i]+1)*k;
     s1=valm;
     incr=1;
     
                for(j=i+1; j<=n && s1-aux+valm>0; ++j){            
                if(a2[j]>=valm){
                saux=(incr+1)*valm-aux;
                             if(saux>s1){
                              s1=saux;
                              ++incr;
                               }                
                }
                aux+=(a1[j+1]-a1[j])*k;            
                   
                   }
 
     valm=a2[i];
     aux=(a1[i]-a1[i-1])*k;
     s2=valm;
     incr=1;
     
                for(j=i-1; j>=1 && s2-aux+valm>0; --j){
                             
                if(a2[j]>=valm){
                saux=(incr+1)*valm-aux;
                if(saux>s2){
                s2=saux;
                ++incr;
                       }
                            }            
                aux+=(a1[j]-a1[j-1])*k;            
                
                } 
    s2-=valm;
    
    solfin=max(solfin,s1+s2);
}
   printf("%lld\n",solfin);    
    return 0;
}