poj3636

来源:互联网 发布:cpu 编程 英语 编辑:程序博客网 时间:2024/06/03 17:54

    一道值得做的题目:LINK:http://poj.org/problem?id=3636

这道题运用到了dilworth定理,但是这里要注意的是原题目的严格的小于(不包含等于),因此第一个参数是按照升序的顺序来排列的,但是第二个元素,由于要求是严格的单调递增,因此在排序第二个元素的时候是按照降序的顺序来排列的,为什么这样做呢?是因为假如第一个参数相同的话,但是第二个参数不相同,但是我们要严格的小,因此降序帮组我们处理了这个问题。

    同时初始的时候,不懂得优化,因此TLE了很多次,后面看了博文终于知道了,要用二分查找(nlogn)


AC CODE:

#include<stdio.h>#include<climits>#include<algorithm>#include<iostream>using namespace std;const int maxn=20010;typedef struct node{  int x,y;}node;node a[maxn];int f[maxn];int cmp(node a, node b){ return a.x<b.x||(a.x==b.x&&a.y>b.y);}int binarysearch(int l,int r,int x){ while(l<=r) {       int m=(l+r)/2;       if(x<=f[m]) l=m+1;   else r=m-1;     }    return l;}void workstation(int n){   f[0]=a[0].y;   int len=0;   for(int i=1;i<n;i++)   {     int j=binarysearch(0,len,a[i].y);     f[j]=a[i].y;     if(j>len)     {    len=j;     }   }   printf("%d\n",len+1);}int main(void){ int t; scanf("%d",&t); while(t--) {       int n;       scanf("%d",&n);       for(int i=0;i<n;i++)       {      scanf("%d %d",&a[i].x,&a[i].y);       }       sort(a,a+n,cmp);       workstation(n);    }return 0;}


0 0
原创粉丝点击