题目传送门:洛谷P4093

题意简述:

给定一个长度为 \(n\) 的序列 \(a\)。

同时这个序列还可能发生变化,每一种变化 \((x_i,y_i)\) 对应着 \(a_{x_i}\) 可能变成 \(y_i\)。

不会同时发生两种变化。

需要找出一个最长的子序列,使得这个子序列在任意一种变化下都是不降的。

只需要求出这个子序列的长度即可。

注意:可以不发生任何变化。

题解:

记 \(f[i]\) 为以第 \(i\) 项结尾的子序列最长长度。

则有转移:\(f[i]=\max_{j<i}(f[j])+1\),同时还要满足 \(maxval_j\le a_i\) 和 \(a_j\le minval_i\)。

按照项从小到大转移,形成了天然的时间顺序,同时还要满足两个偏序限制。
其中 \(maxval_i\) 表示第 \(i\) 项最大能变成的值,\(minval_i\) 表示第 \(i\) 项最小能变成的值。

算上时间顺序,这是一个三维偏序问题,用 CDQ 分治 + 数据结构(我用了树状数组)就能解决。

 #include <cstdio>
#include <algorithm>
using namespace std; const int MN = ;
const int MC = ; int N, M;
int A[MN], Mx[MN], Mn[MN];
int f[MN], Ans;
int p[MN];
inline bool cmp1(int i, int j) { return Mx[i] < Mx[j]; }
inline bool cmp2(int i, int j) { return A[i] < A[j]; } int B[MN];
inline void Ins(int i, int x) { for (; i <= MC; i += i & -i) B[i] = max(B[i], x); }
inline void Clr(int i) { for (; i <= MC; i += i & -i) B[i] = ; }
inline int Qur(int i) { int A = ; for (; i; i -= i & -i) A = max(A, B[i]); return A;} void CDQ(int lb, int rb) {
if (lb == rb) {
f[lb] = max(f[lb], );
return;
}
int mid = lb + rb >> ;
CDQ(lb, mid);
for (int i = lb; i <= rb; ++i)
p[i] = i;
sort(p + lb, p + mid + , cmp1);
sort(p + mid + , p + rb + , cmp2);
int j = lb;
for (int i = mid + ; i <= rb; ++i) {
while (j <= mid && Mx[p[j]] <= A[p[i]]) {
Ins(A[p[j]], f[p[j]]);
++j;
}
f[p[i]] = max(f[p[i]], Qur(Mn[p[i]]) + );
}
for (int i = lb; i <= mid; ++i)
Clr(A[i]);
CDQ(mid + , rb);
} int main() {
int x, y;
scanf("%d%d", &N, &M);
for (int i = ; i <= N; ++i)
scanf("%d", &A[i]),
Mx[i] = Mn[i] = A[i];
for (int i = ; i <= M; ++i)
scanf("%d%d", &x, &y),
Mx[x] = max(Mx[x], y),
Mn[x] = min(Mn[x], y);
CDQ(, N);
for (int i = ; i <= N; ++i)
Ans = max(Ans, f[i]);
printf("%d\n", Ans);
return ;
}

洛谷 P4093: bzoj 4553: [HEOI2016/TJOI2016]序列的更多相关文章

  1. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

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

  2. 洛谷 P2023 BZOJ 1798 [AHOI2009]维护序列

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  3. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  4. 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告

    P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...

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

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

  6. cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )

    hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...

  7. BZOJ 4556 [HEOI2016/TJOI2016]字符串

    BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s ...

  8. 洛谷 P2709 BZOJ 3781 小B的询问

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求$\sum_1^Kc_i^2$的值,其中$c_i$表示数字i在[L..R]中的重复次数.小B请 ...

  9. 洛谷 P2587 BZOJ 1034 [ZJOI2008]泡泡堂

    题目描述 //不知道为什么BZOJ和洛谷都没有这幅图了,大牛们几年前的博客上都有这幅图的,把它贴上来吧 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省 ...

随机推荐

  1. js模块化的总结

    从前端打包的历史谈起 在很长的一段前端历史里,是不存在打包这个说法的.那个时候页面基本是纯静态的或者服务端输出的, 没有 AJAX,也没有 jQuery.Google 推出 Gmail 的时候(200 ...

  2. P3216 [HNOI2011]数学作业

    题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...

  3. P3455 [POI2007]ZAP-Queries

    题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ...

  4. Fortinet Security Fabric

    Fortinet Security Fabric 这个世界从不固步自封.在技术方面,这意味着解决方案供应商必须保持不断创新和探索才能实现生存与发展. 在网络安全领域,这更是至理名言.许多黑客都是才华横 ...

  5. 【转载】dfs序七个经典问题

    作者:weeping 出处:www.cnblogs.com/weeping/ 原文链接 https://www.cnblogs.com/weeping/p/6847112.html 参考自:<数 ...

  6. 洛谷 P1053 逛公园 解题报告

    P3953 逛公园 问题描述 策策同学特别喜欢逛公园. 公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负 ...

  7. 《Linux内核设计与实现》第4章读书笔记

    第四章 进程调度 调度程序负责决定将哪个程序投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.调度程序是像Linux这样的多任务操作系统的基 ...

  8. 详细BP神经网络预测算法及实现过程实例

    1.具体应用实例.根据表2,预测序号15的跳高成绩. 表2 国内男子跳高运动员各项素质指标 序号 跳高成绩() 30行进跑(s) 立定三级跳远() 助跑摸高() 助跑4—6步跳高() 负重深蹲杠铃() ...

  9. https 协议信息查看

    https://www.ssllabs.com/ssltest/」—————————

  10. Git4:Git标签

    目录 简介 新建标签 查看标签详细信息 切换标签 后期添加标签 将标签推送到远端仓库 简介 Git可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本 ...