ACdream 1216

来源:互联网 发布:asp 导出数据到excel 编辑:程序博客网 时间:2024/06/05 20:26

本题目,我用了一种较简单的解题方法依然求LIS

但不同的是要先进行排序,排序方法为先按x 升序排序,在按照y降序排序,然后用nlogn算法即可求解LIS

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define INF 1000010000const int maxn = 100100;struct node {int x,y,id;node (int x=0,int y=0,int id=0):x(x),y(y),id(id){}bool operator <(const node& rhs) const{return x<rhs.x||x==rhs.x&&y>rhs.y;}}a[maxn];int n,d[maxn],g[maxn];int main(){    while(scanf("%d",&n)==1){          for(int i=0;i<n;i++){              scanf("%d %d",&a[i].x,&a[i].y);              a[i].id=i+1;          }          for(int i=1;i<=n;i++) g[i]=INF;          sort(a,a+n);          int ans=1;          for(int i=0;i<n;i++){              int posi=lower_bound(g+1,g+n+1,a[i].y)-g;              g[posi]=a[i].y;              d[i]=posi;              ans=max(ans,posi);          }          int temp=ans,nx,ny;          printf("%d\n",ans);          for(int i=n-1;i>=0;i--){                if(d[i]==temp){                      if(temp==ans||nx>a[i].x&&ny>a[i].y){                          nx=a[i].x; ny=a[i].y;                          if(temp!=ans) printf(" ");                          temp--;                          printf("%d",a[i].id);                      }                }          }          printf("\n");    }    return 0;}



0 0
原创粉丝点击