lis

来源:互联网 发布:js小数做加减 编辑:程序博客网 时间:2024/05/01 19:19



首先显然x<0,y<0都没有鸟用,然后x+1y+1也没有用,虽然这种题似乎第一反应会是矩阵dp,但是你眯起眼睛一列一列得看就会突然发现求一个最长lis好像就可以了,还是用了线段树。

#include <cstdio>  #include <cmath>  #include <ctime>  #include <string>  #include <cstring>  #include <cstdlib>  #include <iostream>  #include <algorithm>    #include<set> #include <vector>  #include<queue>#define pb push_back #define forup(i,a,b) for(int i=(a);i<=(b);i++)  #define fordown(i,a,b) for(int i=(a);i>=(b);i--)    #define maxn 100005 #define maxm 100005 #define INF 1070000000  using namespace std;  typedef long long ll;  typedef unsigned long long ull;    template<class T> inline  void read(T& num){   num = 0; bool f = true;char ch = getchar();   while(ch < '0' || ch > '9') { if(ch == '-') f = false;ch = getchar();}  while(ch >= '0' && ch <= '9') {num = num * 10 + ch - '0';ch = getchar();}   num = f ? num: -num; } int out[100]; template<class T> inline void write(T x,char ch){  if (x==0) {putchar('0'); putchar(ch); return;} if (x<0) {putchar('-'); x=-x;}int num=0; while (x){ out[num++]=(x%10); x=x/10;} fordown(i,num-1,0) putchar(out[i]+'0'); putchar(ch); } /*==================split line==================*/int n;int lis[maxn];int cnt=0; int a[maxn];struct node{int x,y;};node p[maxn];int val[maxn];int L,R,num;int f[maxn];int Ma[maxn*4];bool cmp(node x,node y){if(x.x==y.x)return x.y<y.y;return x.x<y.x;}int Max(int node,int tl,int tr){ if(tl>=L&&R>=tr)  { return Ma[node];}   int mid=(tl+tr)>>1;int cmax=0;     if(L<=mid)   cmax=max(cmax,Max(node<<1,tl,mid));if(R>=mid+1)  cmax=max(cmax,Max(node<<1|1,mid+1,tr));     return cmax;}void updata(int node,int tl,int tr,int pos,int v){ if(tl==tr)  {Ma[node]=max(Ma[node],v); return;}  int mid=(tl+tr)>>1;   if(pos<=mid) updata(node<<1,tl,mid,pos,v);    else         updata(node<<1|1,mid+1,tr,pos,v);   Ma[node]=max(Ma[node<<1],Ma[node<<1|1]);}int main(){ int cnt=0;cin>>n;  forup(i,1,n)   {int x,y; read(x);read(y);     if(x>=0&&y>=0)  {cnt++; val[cnt]=y;p[cnt].x=x;p[cnt].y=y;}} sort(p+1,p+cnt+1,cmp); sort(val+1,val+cnt+1); num=unique(val+1,val+cnt+1)-val-1; forup(i,1,cnt)  p[i].y=lower_bound(val+1,val+num+1,p[i].y)-val; int cmax=1;    forup(i,1,cnt){     L=1;R=p[i].y;int tmp=Max(1,1,num); f[p[i].y]=max(f[p[i].y],tmp+1);       updata(1,1,num,p[i].y,f[p[i].y]);     cmax=max(cmax,f[p[i].y]);    }  cout<<cmax;return 0;}


0 0
原创粉丝点击