zoukankan      html  css  js  c++  java
  • 二维LIS

    其实这题太水了

    就是很简单的线段树维护cdq。

    前对后影响用线段树维护一下即可。

    具体看代码:

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #define N 20004
      5 using namespace std;
      6 int n,dp[N],ans;
      7 struct node
      8 {
      9     int xi;
     10     int yi;
     11     int no;
     12     bool friend operator < (node x,node y)
     13     {
     14         return x.xi<y.xi;
     15     }
     16 }a[N],tmp[N];
     17 struct segtree
     18 {
     19     int vl[N<<2];
     20     void update(int to,int aim,int lx,int rx,int nx)
     21     {
     22         if(lx==rx)
     23         {
     24             vl[nx]=max(vl[nx],aim);
     25             return;
     26         }
     27         int mid=(lx+rx)>>1;
     28         if(to<=mid)
     29         {
     30             update(to,aim,lx,mid,nx<<1);
     31         }else
     32         {
     33             update(to,aim,mid+1,rx,(nx<<1)|1);
     34         }
     35         vl[nx]=max(vl[nx<<1],vl[(nx<<1)|1]);
     36     }
     37     int query(int ln,int rn,int lx,int rx,int nx)
     38     {
     39         if(ln<=lx&&rn>=rx)
     40         {
     41             return vl[nx];
     42         }
     43         int mid=(lx+rx)>>1;
     44         int ret=0;
     45         if(ln<=mid)
     46         {
     47             ret=max(ret,query(ln,rn,lx,mid,nx<<1));
     48         }
     49         if(rn>mid)
     50         {
     51             ret=max(ret,query(ln,rn,mid+1,rx,(nx<<1)|1));
     52         }
     53         return ret;
     54     }
     55 }tr;
     56 void merge(int lx,int rx)
     57 {
     58     int mid=(lx+rx)>>1;
     59     for(int i=lx;i<=rx;i++)
     60     {
     61         tmp[i]=a[i];
     62     }
     63     for(int i=lx,j=mid+1,k=lx;k<=rx;k++)
     64     {
     65         if(i<=mid&&j<=rx)
     66         {
     67             a[k]=tmp[i]<tmp[j]?tmp[i++]:tmp[j++];
     68         }else
     69         {
     70             a[k]=i<=mid?tmp[i++]:tmp[j++];
     71         }
     72     }
     73 }
     74 void sol(int lx,int rx)
     75 {
     76     if(lx==rx)
     77     {
     78         return;
     79     }
     80     int mid=(lx+rx)>>1;
     81     for(int i=lx;i<=rx;i++)
     82     {
     83         tmp[i]=a[i];
     84     }
     85     for(int i=lx,j=mid+1,k=lx;k<=rx;k++)
     86     {
     87         if(tmp[k].no<=mid)
     88         {
     89             a[i++]=tmp[k];
     90         }else
     91         {
     92             a[j++]=tmp[k];
     93         }
     94     }
     95     sol(lx,mid);
     96     memset(tr.vl,0,sizeof(tr.vl));
     97     for(int i=mid+1,j=lx;i<=rx;i++)
     98     {
     99         while(a[j].xi<a[i].xi)
    100         {
    101             if(j>mid)
    102             {
    103                 break;
    104             }
    105             tr.update(a[j].yi,dp[a[j].no],1,N,1);
    106             j++;
    107         }
    108         if(a[i].yi!=1)
    109         {
    110             dp[a[i].no]=max(dp[a[i].no],tr.query(1,a[i].yi-1,1,N,1)+1);
    111         }else
    112         {
    113             dp[a[i].no]=max(dp[a[i].no],1);
    114         }
    115     }
    116     sol(mid+1,rx);
    117     merge(lx,rx);
    118 }
    119 int main()
    120 {
    121     scanf("%d",&n);
    122     for(int i=1;i<=n;i++)
    123     {
    124         scanf("%d%d",&a[i].xi,&a[i].yi);
    125         a[i].no=i;
    126     }
    127     sort(a+1,a+1+n);
    128     dp[1]=1;
    129     sol(1,n);
    130     for(int i=1;i<=n;i++)
    131     {
    132         ans=max(ans,dp[i]);
    133     }
    134     printf("%d
    ",ans);
    135     return 0;
    136 }
    View Code
  • 相关阅读:
    STL的移动算法
    mysql insert和前台显示乱码
    垃圾回收算法简单介绍——JVM读书笔记&lt;二&gt;
    UVA
    读取系统执行状态的shell脚本
    【web 回车】web项目 注册或登录页面 回车登录无效,解决方案
    【maven】maven项目移除Maven Dependencies后如何再添加进去
    【web.xml】报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    【shiro】关于shiro匹配URL的小用法
    【Sets】使用Google Guava工程中Sets工具包,实现集合的并集/交集/补集/差集
  • 原文地址:https://www.cnblogs.com/stddddd/p/9995861.html
Copyright © 2011-2022 走看看