[swustoj 585] 倒金字塔

倒金字塔(0585)

Time limit(ms): 3000 Memory limit(kb): 65535 Submission: 208 Accepted: 48
 
Description
SWUST国的一支科学考察队到达了举世闻名的古埃及金字塔。 
关于金字塔的建造一直是一个未解之谜, 有着“西方史学之父”之称的希罗多德认为,金字塔的建造是人力和牲畜,花费20 年时间从西奈半岛挖掘天然的石头运送到埃及堆砌而成。也有不少人认为是外星人修建的。人们发现胡夫金字塔的经线把地球分成东、西两个半球,它们的陆地面积是相等的,这种“巧合”大概是外星人选择金字塔建造地点的用意。法国化学家戴维·杜维斯则认为,建造金字塔的巨石不是天然的,而是人工浇筑的。 
SWUST 国科考队的队员们正准备研究戴维·杜维斯提出的假说。为了研究这种假说,他们需要用到“倒金字塔模型”。所谓倒金字塔模型,即金字塔由N 层人工浇筑的巨石堆砌而成,非底层的任意一层巨石的长度和宽度都必须要小于等于它下面的一层巨石的长度和宽度。 
现在,科考队队员们打算用手里仅有N 块木板去模拟这个倒金字塔模型。请计算出科考队队员们能够构建的倒金字塔模型的最大高度。
 
Input
测试数据的第1 行,为一个正整数N(N <= 100000),表示科考队队员们手里一共有N 块木板。 
接下来N 行,每行两个数:a,b( a, b <= 100000),分别表示一块木板的长度与宽度。
 
Output
只有一个正整数,为最多可以堆叠的倒金字塔的高度。所有的木板厚度均为1。
 
Sample Input
3
3 2
1 1
2 2
 
Sample Output
1
2
3
 
哎,做了一道题,发现你原来写的一直当模板的东西写错了,是一种多么悲伤的事、
#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

#define N 100005



struct Rect

{

    int x,y;

    bool operator<(const Rect &t)const

    {

        if(x!=t.x) return x<t.x;

        return y<t.y;

    }

}s[N];



int n;

int len;

int dp[N];



int up_bound(int k)

{

    int l=1,r=len+1;

    while(l<r)

    {

        int m=(l+r)/2;

        if(dp[m]<=k) l=m+1;

        else r=m;

    };

    return l;

}

void solve()

{

    len=1;

    dp[1]=s[1].y;

    for(int i=2;i<=n;i++)

    {

        if(s[i].y>=dp[len]) dp[++len]=s[i].y;

        else

        {

            int pos=up_bound(s[i].y);

            dp[pos]=s[i].y;

        }

    }

}

int main()

{

    while(scanf("%d",&n)!=EOF)

    {

        for(int i=1;i<=n;i++)

        {

            scanf("%d%d",&s[i].x,&s[i].y);

        }

        sort(s+1,s+n+1);

        solve();

        printf("%d\n",len);

    }

    return 0;

}

 

你可能感兴趣的:(OJ)