zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDU 6370 dfs+并查集
    牛客网暑期ACM多校训练营(第六场)G
    HDU 6351暴力枚举 6354计算几何
    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 A,D
    2018 百度之星 初赛 第六题 HDU6349
    HDU 6336 子矩阵求和
    HDU 6333 莫队+组合数
    BZOJ 2308 莫队入门经典
    Linux系统管理第一章
    2019年7月17日
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5406126.html
Copyright © 2011-2022 走看看