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\n",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\n",DP(a,n)); 100 } 101 return 0; 102 }