POJ 1065 Wooden Sticks

http://blog.csdn.net/acdreamers/article/details/7626671

学习一下Dilworth定理 推荐一篇写得很好博客

要求最少的覆盖,按照Dilworth定理

最少链划分 = 最长反链长度

所以最少系统 = 最长导弹高度上升序列长度。

之前写的LIS模板不对。。。。。。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<queue>
  5 #include<stack>
  6 #include<cmath>
  7 #include<algorithm>
  8 using namespace std;
  9 #define clc(a,b) memset(a,b,sizeof(a))
 10 #define inf 0x3f3f3f3f
 11 const int N=10010;
 12 #define LL long long
 13 const double eps = 1e-5;
 14 const double pi = acos(-1);
 15 // inline int r(){
 16 //     int x=0,f=1;char ch=getchar();
 17 //     while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
 18 //     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 19 //     return x*f;
 20 // }
 21 const int  maxn = 500010;
 22 int a[maxn];
 23 
 24 struct Node{
 25     int x,y;
 26 };
 27 Node A[N];
 28 int d[N];
 29 
 30 bool cmp(Node a,Node b){
 31     return a.x<b.x||(a.x==b.x&&a.y<b.y);
 32 }
 33 
 34 // int Search(int num,int low,int high){
 35 //     int mid;
 36 //     while(low<=high){
 37 //         mid=(low+high)/2;
 38 //         if(num>=b[mid]) low=mid+1;
 39 //         else high=mid-1;
 40 //     }
 41 //     return low;
 42 // }
 43 
 44 // int DP(int n){
 45 //     int len,pos;
 46 //     b[1]=a[1];
 47 //     len=1;
 48 //     for(int i=2;i<=n;i++){
 49 //         if(a[i]>=b[len]){
 50 //             b[++len]=a[i];
 51 //         }
 52 //         else {
 53 //             pos=Search(a[i],1,len);
 54 //             b[pos]=a[i];
 55 //         }
 56 //     }
 57 //     return len;
 58 // }
 59 
 60 int BSearch(int l,int r,int x)  
 61 {  
 62     while(l < r)  
 63     {  
 64         int m = (l + r) >> 1;  
 65         if(x <= d[m]) r = m;  
 66         else l = m + 1;  
 67     }  
 68     return l;  
 69 }  
 70   
 71 int DP(int a[],int n)  
 72 {  
 73     d[0] = -1;    
 74     int len = 1;  
 75     for(int i=1;i<=n;i++)  
 76     {  
 77         d[len] = inf;  
 78         int j = BSearch(0,len,a[i]);  
 79         if(j == len) len++;  
 80         d[j] = a[i];  
 81     }  
 82     return len - 1;  
 83 } 
 84 int main(){
 85     int n,T;
 86     scanf("%d",&T);
 87     while(T--){
 88         scanf("%d",&n);
 89         for(int i=1;i<=n;i++)
 90             scanf("%d%d",&A[i].x,&A[i].y);
 91         sort(A+1,A+n+1,cmp);
 92         // for(int i=1;i<=n;i++){
 93         //     printf("x:%d y:%d
",A[i].x,A[i].y);
 94         // }
 95         for(int i=1;i<=n;i++)
 96             a[n-i+1]=A[i].y;
 97         // for(int i=1;i<=n;i++)
 98         //     printf("x:%d ",a[i]);
 99         printf("%d
",DP(a,n));
100     }
101     return 0;
102 }
View Code
原文地址:https://www.cnblogs.com/ITUPC/p/5406126.html