Cod sursa(job #180956)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 17 aprilie 2008 18:25:28
Problema Peste Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<fstream.h>

struct nod {
	   int info;
	   nod *next;
	   };

int poz(int a[50002], int b[50002], int p, int u)
	{
	int piva,pivb,aux;
	piva=a[p];pivb=b[p];
	while (p<u)
		{
		if (a[p]>a[u] || a[p]==a[u] && b[p]>b[u]) {
							  aux=a[p];a[p]=a[u];a[u]=aux;
							  aux=b[p];b[p]=b[u];b[u]=aux;
							  }
		if (piva==a[p] && pivb==b[p]) u--;
					else p++;
		}
	return p;
	}

void quick (int a[50002], int b[50002], int p, int u)
	{
	int k;
	if (p<u) {
		 k=poz(a,b,p,u);
		 quick(a,b,p,k-1);
		 quick(a,b,k+1,u);
		 }
	}

void calculeaza (int ap[1002],int k,int t[50002], int poz, int p1[50002], int v[1002], int &m, nod *&p, nod *&u)
	{
	nod *t1,*q;
	int j,sw=0;
	if (!p) {p=new nod;p->info=p1[poz];
		u=p;u->next=0;sw=1;}
	for (j=poz-sw;j>=1 && t[poz]==t[j];j--)
	    if (p1[j]>=p->info) {q=new nod; q->info=p1[j];
			       q->next=p;p=q;}
		else if (p1[j]<=u->info) {q=new nod;
					 q->info=p1[j];
					 u->next=q;
					 u=q;u->next=0;}
			  else {
			       q=p;
			       while (q->next->info>p1[j])
				     q=q->next;
			       t1=new nod;
			       t1->next=q->next;
			       q->next=t1;
			       t1->info=p1[j];
			       }
	q=p; m++;v[m]=0;ap[m]=t[poz];
	while (q && k)
		{
		v[m]+=q->info;
		k--;
		q=q->next;
		}
	if (v[m]==v[m-1]) m--;
	}


int main()
{
int ap[1002],i,n,k,v[1002],t[50002],p1[50001],m=0,T;
ifstream f("peste.in");
f>>n>>k>>T; v[0]=0;
for (i=1;i<=n;i++)
	f>>p1[i]>>t[i];
f.close();
quick(t,p1,1,n);
nod *p,*u,*q;
p=0;t[0]=p1[0]=0;
for (i=1;i<n;i++)
	if (t[i]!=t[i+1]) calculeaza (ap,k,t,i,p1,v,m,p,u);
calculeaza(ap,k,t,n,p1,v,m,p,u);
long long pg[50002],j;
memset(pg,0,sizeof(pg));
for (i=1;i<=m;i++)
	if (pg[ap[i]]<v[i]) pg[ap[i]]=v[i];
for (j=1;j<=T;j++)
	if (pg[j]!=0)
		for (i=1;i<=m;i++)
			if (pg[j+ap[i]]<pg[j]+v[i]) pg[j+ap[i]]=pg[j]+v[i];
long long max=0;
for (i=1;i<=T;i++) if (max<pg[i]) max=pg[i];
ofstream g("peste.out");
g<<max;
g.close();
return 0;
}