http://acm.pku.edu.cn/JudgeOnline/problem?id=1065
Код:
#define maxn 5003
#include<string.h>
#include<stdio.h>
long int k,l[maxn],w[maxn],h[maxn];
void make1(long int s,long int t)
{int i,j,x,t1;
i=s;j=t;x=i;
do
{while ((i<j)&&(l[j]>=l[x])) j-=1;
t1=l[j];l[j]=l[x];l[x]=t1;
t1=w[j];w[j]=w[x];w[x]=t1;
x=j;
while ((i<j)&&(l[i]<=l[x])) i+=1;
t1=l[i];l[i]=l[x];l[x]=t1;
t1=w[i];w[i]=w[x];w[x]=t1;
x=i;}
while (i<j);
k=x;
}
void make2(long int s,long int t)
{
if (s<t)
{ make1(s,t);
make2(s,k-1);
make2(k+1,t);
}
}
int main()
{long int max,sec,i,j,q,k,m,n;
scanf("%ld",&m);
for (q=1;q<=m;q++)
{ memset(l,0,sizeof(l));
memset(w,0,sizeof(w));
scanf("%ld",&n);
for (i=1;i<=n;i++){scanf("%ld",&l[i]);scanf("%ld",&w[i]);}
k=0;make2(1,n);
for (i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
{if ((l[i]==l[j])&&(w[i]>w[j]))
{max=w[i];w[i]=w[j];w[j]=max;}
if (l[j]>l[i]) break;
}
memset(h,0,sizeof(h));k=1;h[1]=w[1];
for (i=2;i<=n;++i)
{max=-1;
for (j=1;j<=k;++j)
if (w[i]>=h[j]&&max<h[j]) {max=h[j];sec=j;}
if (max==-1) h[++k]=w[i];
else h[sec]=w[i];
}
printf("%ld\n",k);
}
}