题目链接:BZOJ 洛谷
\(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\)

 for(int j=1; j<i; ++j)if(a[j]<=minv[i]&&maxv[j]<=a[i])//序列只会变换一次 dp[i]=max{dp[j]+1};

转移要满足两个条件:\(a[j]<=minv[i]\ \&\&\ maxv[j]<=a[i]\)
一个二维偏序问题,CDQ、树套树都可以。
拿\(minv[x]\)和\(a[y]\)作为两个坐标轴,\(dp[j]\)表示其上一点\((A[j],maxv[j])\).
这样就成了一个二维平面,可以向其中插入一些点dp[i],询问一个矩形区域(也是一段前缀)中某点最大值
线段树套线段树 树状数组套线段树都可做 复杂度\(O(nlog^2n)\)
后者时间还可以
树状数组套线段树:

//企图二维树状数组 但动态开点的话 中间一段没有的区间会中断y方向的Query..
#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
#define now node[rt]
#define lson l,m,node[rt].ls
#define rson m+1,r,node[rt].rs
#define lb(x) ((x)&-(x))
const int N=1e5+5;int n,m,A[N],minv[N],maxv[N],MaxV,MaxA;
namespace Tree_2D
{struct Seg_Tree{struct Node{int maxv,ls,rs;}node[N<<6];//还要再小点。。不然BZOJ上依旧MLE inline int new_Node(){static int cnt=0;return ++cnt;}void Insert(int l,int r,int &rt,int p,int v){if(!rt) rt = new_Node();now.maxv = std::max(now.maxv, v);if(l<r){int m=l+r>>1;if(p<=m) Insert(lson,p,v);else Insert(rson,p,v);}}int Query(int l,int r,int rt,int L,int R){if(!rt) return 0;if(L<=l && r<=R) return now.maxv;int m=l+r>>1;if(L<=m)if(m<R) return std::max(Query(lson,L,R),Query(rson,L,R));else return Query(lson,L,R);return Query(rson,L,R);}}t;struct Bit{int root[N];void Insert(int p,int y,int v){while(p<=MaxV)t.Insert(1,MaxA,root[p],y,v), p+=lb(p);}int Query(int p,int y){int res=0;while(p)res=std::max(res,t.Query(1,MaxA,root[p],1,y)), p-=lb(p);return res;}}t2D;
}
#undef now
inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}int main()
{n=read(),m=read();for(int i=1; i<=n; ++i)maxv[i]=minv[i]=A[i]=read(), MaxA=std::max(MaxA,A[i]);for(int x,y,i=1; i<=m; ++i)x=read(), y=read(), maxv[x]=std::max(maxv[x],y), minv[x]=std::min(minv[x],y);for(int i=1; i<=n; ++i) MaxV=std::max(MaxV,maxv[i]);int ans=0;for(int v,i=1; i<=n; ++i){v = Tree_2D::t2D.Query(minv[i],A[i]) + 1;Tree_2D::t2D.Insert(A[i],maxv[i],v);ans=std::max(ans,v);}printf("%d",ans);return 0;
}

二维线段树:

/*
BZOJ上直接MLE...洛谷P4093 4508ms(比Bit套Segtree慢3倍+) 293.33MB
空间消耗比较大 写指针吧。。
*/
#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
#define lson l,m,rt->ls
#define rson m+1,r,rt->rs
const int N=1e5+5;int n,m,A[N],maxv[N],minv[N],MaxA,MaxV;
namespace Seg_Tree2D
{struct Node{int maxv;Node *ls,*rs;Node(): maxv(0),ls(NULL),rs(NULL) { }}pool[N<<7];//(logN)^2=256(2^8) 开得小点吧要不空间会炸 struct Node2D{Node *root;Node2D *ls,*rs;Node2D(): root(NULL),ls(NULL),rs(NULL) { }}pool2D[N<<1],*root;inline Node *new_Node(){static int cnt=0;return &pool[cnt++];}inline Node2D *new_Node2D(){static int cnt=0;return &pool2D[cnt++];}Node2D *Build(int l,int r){Node2D *rt = new_Node2D();if(l<r){int m=l+r>>1;rt->ls = Build(l,m);rt->rs = Build(m+1,r);}return rt;}int Query(int l,int r,Node *rt,int L,int R){if(!rt) return 0;if(L<=l && r<=R) return rt->maxv;int m=l+r>>1;if(L<=m)if(m<R) return std::max(Query(lson,L,R),Query(rson,L,R));else return Query(lson,L,R);return Query(rson,L,R);}int Query2D(int l,int r,Node2D *rt,int L,int R,int y1,int y2){if(L<=l && r<=R) return Query(1,MaxA,rt->root,y1,y2);int m=l+r>>1;if(L<=m)if(m<R) return std::max(Query2D(lson,L,R,y1,y2),Query2D(rson,L,R,y1,y2));else return Query2D(lson,L,R,y1,y2);return Query2D(rson,L,R,y1,y2);}void Insert(int l,int r,Node *&rt,int p,int v){if(!rt) rt = new_Node();//!rt->maxv = std::max(rt->maxv, v);if(l<r){int m=l+r>>1;if(p<=m) Insert(lson,p,v);else Insert(rson,p,v);}}void Insert2D(int l,int r,Node2D *rt,int p,int y,int v){Insert(1, MaxA, rt->root, y, v);if(l<r){int m=l+r>>1;if(p<=m) Insert2D(lson,p,y,v);else Insert2D(rson,p,y,v);}}void Init(){root = Build(1,MaxV);}int Query_Max(int l,int r,int y1,int y2){return Query2D(1,MaxV,root,l,r,y1,y2);}void Insert_Node(int x,int y,int v){Insert2D(1,MaxV,root,x,y,v);}
}
inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}int main()
{n=read(),m=read();for(int i=1; i<=n; ++i)maxv[i]=minv[i]=A[i]=read(), MaxA=std::max(MaxA,A[i]);for(int x,y,i=1; i<=m; ++i)x=read(), y=read(), maxv[x]=std::max(maxv[x],y), minv[x]=std::min(minv[x],y);for(int i=1; i<=n; ++i) MaxV=std::max(MaxV,maxv[i]);Seg_Tree2D::Init();int ans=0;for(int v,i=1; i<=n; ++i){v = Seg_Tree2D::Query_Max(1,minv[i],1,A[i]) + 1;Seg_Tree2D::Insert_Node(A[i],maxv[i],v);ans=std::max(ans,v);}printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8440693.html

BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)相关推荐

  1. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

    Zju2112 Dynamic Rankings description solution code description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须 ...

  2. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  3. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  4. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  5. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  6. 【BZOJ1901】Dynamic Rankings,树状数组套主席树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...

  7. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  8. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  9. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

最新文章

  1. 软件版本中 release stable alpha beta pre snapshot 区别
  2. su命令 sudo命令 限制root远程登录
  3. python中词云图是用来描述_python中实现词云图
  4. java 拼图_功能项目拼图将Java 9引入
  5. python网络编程--UDP客户端
  6. Emmet快速编写HTML代码
  7. 基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder
  8. java swing 属性控件_Java Swing控件属性归纳
  9. PHP数据处理之下载远程图片到本地
  10. BIGEMAP地图下载器(91卫图助手)功能对比
  11. excel粘贴时出现故障_excel无法复制粘贴怎么办?告诉你解决方法
  12. 让你的工作变轻松的一套免费的 iPhone 手势图标
  13. 前端用到的单词(读音+意思)
  14. 关于高维空间的一些思考
  15. 抑制背景干扰的行人重识别方法
  16. 用excel解蓝桥杯(2018年第九届蓝桥杯A组)
  17. wps怎么加高亮_这些WPS表格小技巧可以在工作中省力N倍!
  18. 2018年个人所得税Excel计算公式
  19. django 聚合查询 最大值与最小值 200316
  20. 使用tabula-java解析pdf的表格生成csv,再用opencsv读取csv

热门文章

  1. C++ Primer(第五版)第七章 类 部分答案
  2. 计算机知识小技巧,计算机知识---基本操作小技巧.pptx
  3. datatable使用_使用Streamlit从简单的Python脚本创建交互式WebApp
  4. springboot启动自动关闭_App自动化测试用例格式和App的启动与关闭
  5. python利用什么模块_什么是Python的heapq模块?
  6. pcl中ransac提取直线_复杂场景中的一个图像配准思路
  7. java socket 传送进度_java-★-Socket文件上传/进度条
  8. 用vs写python和c++需要哪些工具包_从运行效率与开发效率比较Python和C++
  9. java 区号_求您!JAVA作业,窗口查询区号!
  10. Ubunt中卸载protobuf与安装3.6.0版本步骤