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
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS
- LIS++
- lis
- lis
- LIS
- Lis
- 造成datagrid二次请求的可能原因之一
- Ali 数加 - Quick BI
- 大量的TIME_WAIT的解决办法
- 图片形变Mesh
- oracle 用一个表的多个字段更新另一个表对应的多个字段
- lis
- 如何用贝塞尔曲线处理控件的边缘化
- Linux-常见环境变量及其作用
- JMX远程监控ActiveMQ设置
- swift UItableView
- ROS smach-----创建层级状态机
- H5edu浅谈HTML5语法标记
- ButterKnife使用
- Android UI控件总结