洛谷 P4093: bzoj 4553: [HEOI2016/TJOI2016]序列
题目传送门:洛谷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]序列的更多相关文章
- 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[ ...
- 洛谷 P2023 BZOJ 1798 [AHOI2009]维护序列
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告
P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 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; ...
- BZOJ 4556 [HEOI2016/TJOI2016]字符串
BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s ...
- 洛谷 P2709 BZOJ 3781 小B的询问
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求$\sum_1^Kc_i^2$的值,其中$c_i$表示数字i在[L..R]中的重复次数.小B请 ...
- 洛谷 P2587 BZOJ 1034 [ZJOI2008]泡泡堂
题目描述 //不知道为什么BZOJ和洛谷都没有这幅图了,大牛们几年前的博客上都有这幅图的,把它贴上来吧 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省 ...
随机推荐
- 卸载Visual Studio最佳方法难道真的是重装系统?
卸载Visual Studio最佳方法难道真的是重装系统? 卸载Visual Studio最佳方法难道真的是重装系统? 使用TotalUninstaller貌似也没有效果,默认卸载的,程序列表里面还是 ...
- TypeError: to_categorical() got an unexpected keyword argument 'nb_classes'
在学习莫烦教程中keras教程时,报错:TypeError: to_categorical() got an unexpected keyword argument 'nb_classes',代码如下 ...
- MT【137】多少个?
数列\(\{a_n\}\)共11项,\(a_1=0,a_{11}=4\),且\(|a_{k+1}-a_{k}|=2,k=1,2,\cdots,10\) 求满足条件的不同的数列的个数______ 解答: ...
- 【题解】玲珑杯河南专场17B
容斥大法妙~其实网上很多的题解虽然给出了容斥系数,但是并没有说明为什么是这个样子的.在这里解释一下好了. 考虑用容斥,实际上就是让 \(ans = \sum_{T\subseteq S}^{\ }f_ ...
- BZOJ1443 [JSOI2009]游戏Game 【博弈论 + 二分图匹配】
题目链接 BZOJ1443 题解 既然是网格图,便可以二分染色 二分染色后发现,游戏路径是黑白交错的 让人想到匹配时的增广路 后手要赢[指移动的后手],必须在一个与起点同色的地方终止 容易想到完全匹配 ...
- 彻底解决mac下terminal路径显示问题
mac 配色 mac shell配色 ~/.bash_profile是bash shell中当前登录用户的配置文件.bash是“终端”中默认的shell. alias ls=”ls -G”是给”ls ...
- 什么是 metadata (元数据)
1. 什么是元数据 任何文件系统中的数据分为数据和元数据.数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限.文件拥有者以及文件数据块的分布信息(inode...) ...
- Codeforces Good Bye 2018
咕bye 2018,因为我这场又咕咕咕了 无谓地感慨一句:时间过得真快啊(有毒 A.New Year and the Christmas Ornament 分类讨论后等差数列求和 又在凑字数了 #in ...
- JS--数组和字典
一.JS数组 JavaScript中的数组类似于Python的列表 a = [11,22,33,44] 常见功能: obj.length 数组的大小 obj.push(ele) 尾部追加元素 obj ...
- python pip安装--不是内部或外部命令--解决方案
首先在 命令行中输入 python -m ensurepip 创建出pip3.exe , 并找到pip3.exe所在的Scripts路径 使命令行在Scripts路径下 输入pip3 install ...