1689 建造高塔

1689 建造高塔

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description
n有n种石块,石块能无限供应。每种石块都是长方体,其中第i种石块的长、宽、高分别为li、wi、hi。石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度。如果要把一个石块放在另一个石块上面,必须保证上面石块的长和宽都分别严格小于下面石块的长和宽。这意味着,即使两块长宽相同的石块也不能堆砌起来。
现在神犇想知道,最多能用上多少块石头呢?


 
输入描述 Input Description

第一行,N; 
以下N行,每行三个数,表示第i种石头的长宽高。

输出描述 Output Description

一个整数,表示最多能用上多少块石头。

样例输入 Sample Input
3
1 1 1
2 2 2
3 3 4
样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

N≤50000,其余数字≤maxlongint。

分类标签 Tags 点此展开 

 
 
提供几组数据(样例太水了)
Point1
5
38855 19141 16949
31471 40006 27231
20991 1909 27120
45405 18298 48053
16192 32360 4671
正确答案
> 6

Point2
49
31567 25585 1484
30138 35885 27814
1946 24590 28784
7914 9961 20005
48363 34524 12425
48648 43557 12123
38778 20344 35305
44089 18685 26186
22033 41923 36829
8764 10946 37483
2691 48431 22727
23915 38466 41743
8122 6795 41839
12885 17369 35943
28549 2817 44764
13386 45432 1026
22337 48109 1279
3031 42628 1206
34534 11440 38112
30292 30721 2722
25125 15253 20428
16684 2320 43043
23711 48835 21518
30524 38326 49077
6473 44323 25053
41342 36590 11419
21870 30291 20678
29368 34738 4434
35269 15948 906
46656 49845 43618
36644 38000 34666
24914 26227 23254
24724 14968 33826
18853 42268 13086
31126 684 9635
42377 28174 34321
1669 23667 22501
31429 32435 2456
9854 3388 19212
26624 9578 28696
28653 30013 32537
1965 12969 38319
45129 10892 21843
8876 7362 31091
24994 34284 47271
31118 11781 10535
5321 7178 49997
7608 47670 28078
19631 9944 49069
正确答案
> 26

Point3
48
44843 2943 31140
11506 43625 31345
37202 27528 44682
47653 17756 21963
27917 43398 31410
49487 45901 6954
37773 49233 40891
21382 21946 15848
48177 27545 15295
41580 19827 28072
19359 34396 47306
45209 38021 37165
19846 43888 31501
31659 12360 35133
2499 17511 7875
39259 49943 34727
22305 15907 33602
10466 37455 17186
20854 22583 13222
34027 22219 43496
14427 15312 41434
46873 35790 22914
32476 37011 17463
16315 7265 18452
4224 49080 2513
2574 13647 49867
30794 17206 36320
19972 49519 7302
41360 26352 43756
11203 23457 13794
3867 43983 35628
33585 35052 16298
32208 36482 33775
33277 23494 40638
1790 15859 44299
15936 26821 34962
22488 18571 22646
22549 38741 7434
29844 43304 6163
48982 5418 15987
9428 44044 44463
17177 10264 31861
24580 27513 31788
11738 25952 15752
40949 26315 21372
12681 49725 33075
34521 34982 16625
30231 47599 25228
正确答案
> 28

 

题解:

把一组li、wi、hi拆成6组l,r(长,宽||显然只与这两项有关)//题目说有n种石块,石块能无限供应

按l升序排列(l相等时按r的降序排列)

nlogn跑一遍r的最长严格上升子序列,就好了

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define N 50010
inline const int read(){
    register int x=0,f=1;
    register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct node{
    int l,r;
    bool operator < (const node &x) const{
        if(l==x.l) return r>x.r;
        return l<x.l;
    } 
}e[N<<3];
int n,cnt,len,b[N<<3];
void LIS(){
    b[len=1]=e[1].r;
    for(int i=2;i<=cnt;i++){
        if(e[i].r>b[len]){
            b[++len]=e[i].r;
        }
        else{
            int pos=lower_bound(b+1,b+len+1,e[i].r)-b;
            b[pos]=e[i].r;
        }
    }
    printf("%d\n",len);
}
int main(){
    n=read();
    for(int i=1,x,y,z;i<=n;i++){
        x=read();y=read();z=read();
        e[++cnt]=(node){x,y};
        e[++cnt]=(node){y,x};
        e[++cnt]=(node){x,z};
        e[++cnt]=(node){z,x};
        e[++cnt]=(node){z,y};
        e[++cnt]=(node){y,z};
    }
    sort(e+1,e+cnt+1);
    LIS();
    return 0;
}

 

posted @ 2016-08-16 17:28  神犇(shenben)  阅读(286)  评论(0编辑  收藏  举报