ACdream 1216

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

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

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 1000010000
const 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;
}



你可能感兴趣的:(ACdream 1216)