题目描述

佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可 。

注意:每种变化最多只有一个值发生变化。在样例输入1中,所有的变化是:

1 2 3
2 2 3 1 3 3 1 1 3 1 2 4 

选择子序列为原序列,即在任意一种变化中均为不降子序列在样例输入2中,所有的变化是:

3 3 3
3 2 3

选择子序列为第一个元素和第三个元素,或者第二个元素和第三个元素,均可满足要

输入输出格式

输入格式:

输入的第一行有两个正整数n, m,分别表示序列的长度和变化的个数。接下来一行有n个数,表示这个数列原始的状态。接下来m行,每行有2个数x, y,表示数列的第x项可以变化成y这个值。1 <= x <= n。

输出格式:

输出一个整数,表示对应的答案

输入输出样例

输入样例#1: 复制

3 4
1 2 3
1 2
2 3
2 1
3 4

输出样例#1: 复制

3

说明

对于20%数据所有数字均为正整数,且小于等于300

对于50%数据所有数字均为正整数,且小于等于3,000

对于100%数据所有数字均为正整数,且小于等于100,000

这道题是DP应该不难看出来。

$dp[i]$表示选择$i$以后所能形成的满足条件的子序列的最大值

转移的时候枚举前面的点$(j)$。

设$MX[i]$表示$i$号位置能变成的最大值,$MI[i]$表示$i$号位置能变成的最小值,$a$为原序列

这样转移的时候会有两个限制条件

$a[i]>=MX[j]$ && $MI[i]>=a[j]$

这很明显是个二维偏序问题嘛,用CDQ树套树什么的都可以搞。

树套树的话,将$a$抽象为$x$轴,将$MX$抽象为$y$轴

转移的时候我们实际是在左下角为$(0,0)$,右上角为$MI[i],a[i]$的矩阵中查最大值

每次转移对答案的贡献的话实际上只是改变了$a[i],mx[i]$的值

然后就能很自然的想到树套树了,线段树套线段树或者树状数组套线段树都可以搞

后者常数小一些

线段树的数组一定要开的足够大!!!!

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=6*1e6+10;
const int MAXNN=1e5+10;
const int INF=1e8+10;
inline int read()
{char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int root[MAXN],N,M,MX[MAXNN],MI[MAXNN],a[MAXNN];
struct S
{struct node{int ls,rs,mx;}T[MAXN];int tot;int query(int now,int ll,int rr,int pos){if(ll==rr) return T[now].mx;int mid=ll+rr>>1;if(pos<=mid) return query(T[now].ls,ll,mid,pos);else return max( T[T[now].ls].mx , query(T[now].rs,mid+1,rr,pos));    }void change(int &now,int ll,int rr,int pos,int val){if(!now) now=++tot;T[now].mx=max(T[now].mx,val);if(ll==rr) return ;int mid=ll+rr>>1;if(pos<=mid) change(T[now].ls,ll,mid,pos,val);else          change(T[now].rs,mid+1,rr,pos,val);}
}tree;
struct B
{ int N;int Tree[MAXNN];int lowbit(int p) {return p&(-p);}int Query(int k,int val){int ans=0;while(k) {ans=max(ans,tree.query(root[k],1,N,val));k-=lowbit(k);}return ans;}void Change(int k,int pos,int val){while(k<=N){tree.change(root[k],1,N,pos,val);k+=lowbit(k);}}
}BIT;
int main()
{//freopen("heoi2016_seq.in","r",stdin);//freopen("heoi2016_seq.out","w",stdout);N=read();M=read();for(int i=1;i<=N;i++) MX[i]=MI[i]=a[i]=read();for(int i=1;i<=M;i++){int x=read(),y=read();MX[x]=max(MX[x],y);BIT.N=max(BIT.N,MX[x]);MI[x]=min(MI[x],y);}int ans=0;for(int i=1;i<=N;i++){int now=BIT.Query(MI[i],a[i])+1;BIT.Change(a[i],MX[i],now);ans=max(ans,now);}printf("%d",ans);return 0;
}

洛谷P4093 [HEOI2016/TJOI2016]序列相关推荐

  1. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  2. 洛谷P4094 [HEOI2016/TJOI2016]字符串【后缀数组+主席树+st表】

    时空限制 2000ms / 256MB 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确 ...

  3. 洛谷 P4094 [HEOI2016/TJOI2016]字符串 后缀数组+二分+主席树

    题目链接 后缀数组 题目分析: sa[i] – 第i小的后缀的编号 rank[i] --编号为i的后缀排第几: height[i] – 第i和第i-1的最长lcp最长公共前缀: 1.二分答案,答案肯定 ...

  4. 洛谷 P4091 [HEOI2016/TJOI2016]求和 任意模数fft

    题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: f(n)=∑ni=0∑ij=0S(i,j)×2j×(j!) f ( n ) = ∑ i = 0 n ...

  5. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  6. 【洛谷P2023】维护序列

    这个板子不打就是手生--一段时间不会处理线段树了qwq,这个题难点就是在于下放标记 #include<iostream> #include<cstring> #include& ...

  7. YBTOJ洛谷P4331:数字序列(左偏树)

    文章目录 题目描述 数据范围 解析 代码 题目描述 数据范围 n<=1e6n<=1e6n<=1e6 解析 先考虑简单情况 如果原数列是单调递增的,显然应该使bi=aib_i=a_ib ...

  8. [HEOI2016/TJOI2016]序列

    题解: 很水的题目 首先容易发现每个位置实际上只有最大值是有用的 然后把条件变成dp[i]=max(dp[j]+1)(j<i,F[i]>G[j],G[i]>H[j]) 然后我研究了一 ...

  9. 洛谷P2023 [AHOI2009]维护序列

    数据比线段树2要毒瘤,一直60分的原因是: 1.long long 没开 2.没有边做边%或者像我P3373一样写了个看着像的边做边% 3.要看注释的话可以跳到P3373 上代码 1 #include ...

  10. 栈——验证栈序列(洛谷 P4387)

    题目选自洛谷P4387 是一道栈的题,能够帮助理解栈的更深层次. 题目大意就是判断序列是否可能是对应序列的出栈序列. 如何判断是不是合理的出栈序列呢? 对于序列a 我们依次和序列b来比较,如果不相同, ...

最新文章

  1. JavaScript初体验之冲出迷雾,我四个多小时的经验教训_AX
  2. OpenStack Nova核心组件和RabbitMQ通信流程分析
  3. 股东痛斥联想管理层:都是帅哥 但业绩差
  4. 如果不清楚设计方向,圣诞设计模板可以帮助你轻松建立节日主题。
  5. catkin_make:Project ‘cv_bridge‘ specifies ‘/usr/include/opencv‘ as an include dir, which is not fo
  6. 7c盘满了怎么扩容_C盘爆满怎么办?扩容!
  7. Error running ‘Tomcat x.x.xx‘: Address localhost:xxxx is already in use
  8. WinForm TabControl美化
  9. mysql数据库建表的作用_浅谈(SQL Server)数据库中系统表的作用
  10. 女生叫你哥和大哥区别_大哥正望着你
  11. Technorati的后台数据库架构
  12. 一名2012计算机应届毕业生的求职之路
  13. 怎么把ppt文字大小设置一致_学会这个方法,轻松制作海报级别的霓虹灯PPT!
  14. 一、多媒体技术的基础本章小结
  15. java语言中 逻辑常量_在 Java语言中 ,逻辑常量只有哪两个值 (true,false)_语文答案_学小易找答案...
  16. 小学生台灯哪个品牌更护眼?精选教育部认可护眼灯品牌
  17. 物联网平台TZ-IOT发布透传云内测服务:V1.0
  18. labview调用python 开发视觉_龙哥教你学视觉—tensorflow目标检测LabVIEW深度学习教程...
  19. 支持幻灯片演示的思维导图软件NovaMind_我是亲民_新浪博客
  20. 贝尔实验室的百年沉浮

热门文章

  1. LabWindows/CVI(一):各文件类型的含义及初始项目的搭建
  2. Echarts5.3.0-南丁格尔玫瑰图之半圆
  3. word顶部有一道线_word文档上方总有一条线怎样去掉?
  4. 【服务器数据恢复】服务器raid5磁盘阵列分区丢失的数据恢复案例
  5. Elasticsearch和Spring Data Elasticsearch版本对应
  6. 十大关系数据库SQL注入工具一览
  7. 串口调试助手fx2n_PLC串口调试助手
  8. 【智能家居】智能单火开关目前普遍存在的问题
  9. Tree Walk(二叉树的遍历)
  10. 907计算机专业基础与408相比,2018计算机考研专业课精选练习题(4)