Cod sursa(job #585697)

Utilizator swift90Ionut Bogdanescu swift90 Data 30 aprilie 2011 11:10:33
Problema Avioane Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 1.69 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
struct dfsd{
	long long val,cnt;
}red[100100];
long long N,R,nr[100100],sol,rasp,cr;
long long p[100100];
struct arbore{
	long long v,val;
}arb[400400];
void cstr(int st,int dr,int poz){
	if(st==dr){
		p[st]=poz;
		return;
	}
	int mij=(st+dr)/2;
	cstr(st,mij,poz*2);
	cstr(mij+1,dr,2*poz+1);
}
inline long long maxim(long long a,long long b){
	return a>b?a:b;
}
void update(long long x,long long va,int poz){
	poz=p[poz];
	arb[poz].v=x;
	arb[poz].val=va;
	poz>>=1;
	while(poz>=1){
		if(arb[poz*2].v>arb[poz*2+1].v){
			arb[poz].v=arb[poz*2].v;
			arb[poz].val=arb[poz*2].val;
		}
		else{
			arb[poz].v=arb[poz*2+1].v;
			arb[poz].val=arb[poz*2+1].val;
		}
		poz>>=1;
	}
}
void query(int st,int dr,int x,int y,int poz){
	if(y<st || dr<x)
		return;
	if(st<=x && y<=dr){
		if(arb[poz].v>sol){
			sol=arb[poz].v;
			cr=arb[poz].val;
		}
		return;
	}
	int mij=(x+y)/2;
	query(st,dr,x,mij,poz*2);
	query(st,dr,mij+1,y,poz*2+1);
}
int main(){
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	long long i,x,ax;
	scanf("%lld",&N);
	for(i=0;i<N;++i)
		scanf("%lld",&nr[i]);
	sort(nr,nr+N);
	R=0;
	for(i=0;i<N;++i){
		if(nr[i]==red[R].val)
			++red[R].cnt;
		else{
			red[++R].val=nr[i];
			red[R].cnt=1;
		}
	}
	cstr(1,R,1);
	x=N;
	for(i=1;i<=R;++i){
		ax=x*red[i].val;
		update(ax,red[i].val,i);
		x-=red[i].cnt;
	}
	x=0;
	for(i=R+1;i>0;--i){
		x+=red[i].cnt;
		ax=x*red[i].val;
		sol=-1;
		if(i>1){
			query(1,i-1,1,R,1);
			sol-=cr*x;
		}
		else
			sol=0;
		if(sol+ax>rasp)
			rasp=sol+ax;
	}
	printf("%lld\n",rasp);
	fclose(stdin);
	fclose(stdout);
	return 0;
}