luogu4093 [HEOI2016/TJOI2016]序列
因为一个变化只会变化一个值,所以
\(dp[i]=max(dp[j])+1,j<i,maxval_j \leq a[i], a[j] \leq minval_i\)
发现跟二维数点问题挺像,树状数组套线段树爽一爽。
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, zdz[100005], zxz[100005], a[100005], uu, vv, cnt, dp[100005], ans, rot[100005];
struct Node{int l, r, zdz;
}nd[9000005];
int lb(int x){return x&-x;
}
void insert(int &o, int l, int r, int x, int k){if(!o) o = ++cnt;if(l==r) nd[o].zdz = max(nd[o].zdz, k);else{int mid=(l+r)>>1;if(x<=mid) insert(nd[o].l, l, mid, x, k);if(mid<x) insert(nd[o].r, mid+1, r, x, k);nd[o].zdz = max(nd[nd[o].l].zdz, nd[nd[o].r].zdz);}
}
int query(int o, int l, int r, int x, int y){if(!o) return 0;if(l>=x &&r<=y) return nd[o].zdz;else{int mid=(l+r)>>1;int re=0;if(x<=mid) re = max(re, query(nd[o].l, l, mid, x, y));if(mid<y) re = max(re, query(nd[o].r, mid+1, r, x, y));return re;}
}
int main(){cin>>n>>m;for(int i=1; i<=n; i++){scanf("%d", &a[i]);zdz[i] = zxz[i] = a[i];}for(int i=1; i<=m; i++){scanf("%d %d", &uu, &vv);zdz[uu] = max(zdz[uu], vv);zxz[uu] = min(zxz[uu], vv);}for(int i=1; i<=n; i++){for(int j=zxz[i]; j; j-=lb(j))dp[i] = max(dp[i], query(rot[j], 1, 100000, 1, a[i]));dp[i]++;ans = max(ans, dp[i]);for(int j=a[i]; j<=100000; j+=lb(j))insert(rot[j], 1, 100000, zdz[i], dp[i]);}cout<<ans<<endl;return 0;
}
转载于:https://www.cnblogs.com/poorpool/p/8446767.html
luogu4093 [HEOI2016/TJOI2016]序列相关推荐
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- [HEOI2016/TJOI2016]序列
题解: 很水的题目 首先容易发现每个位置实际上只有最大值是有用的 然后把条件变成dp[i]=max(dp[j]+1)(j<i,F[i]>G[j],G[i]>H[j]) 然后我研究了一 ...
- P2825 [HEOI2016/TJOI2016]游戏
题目描述 详见 P2825 [HEOI2016/TJOI2016]游戏. solution 套路题. 一般思路是行列建点跑二分图最大匹配. 此题中的#会分隔行列,因此我们把每行的极大联通块设为点,列 ...
- [HEOI2016/TJOI2016]求和(第二类斯特林数)
题目 [HEOI2016/TJOI2016]求和 关于斯特林数与反演的更多姿势\(\Longrightarrow\)点这里 做法 \[\begin{aligned}\\ Ans&=\sum\l ...
- 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]
题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...
- [HEOI2016/TJOI2016]排序
题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...
- BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)
题目链接 (lugou) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)
题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...
- P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...
- 主席树 + 后缀数组求LCP + 二分套二分 ---- P4094 [HEOI2016/TJOI2016]字符串
题目链接 题目大意: 解题思路: 设我们的答案为midmidmid(注意这里有坑是[a,b][a,b][a,b]的所有子串和[c,d][c,d][c,d]这个子串的最长lcplcplcp),那么我们会 ...
最新文章
- 运行在浏览器中的深度学习框架,开源了
- 微软的PivotViewer控件编程续
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十二)
- python编程题-python编程题库
- sql 2020 0528
- 书脊开胶了用什么胶粘_画册印制1万本,结果一本不能用,这些问题你注意了吗...
- mysql python 3.5_python3.5 与 mysql 交互
- 详细了解BGP—边界网关协议
- 在JavaScript中实现yield,实用简洁实现方式。
- P4770:你的名字(SAM、线段树合并)
- Minify框架分析,主要功能类简介
- 唯一索引与主键索引的比较
- 谷歌2D景观转3D风景大片,无惧复杂光线与遮挡
- 【Linux 4,2021最新Java笔试题及答案
- html设置网页字体大小,CSS根据用户需求设置网页字体大小
- RESTfull API简单项目的快速搭建
- 于娟的忠告----生命只有一次,活着才是王道啊!!!
- u盘的大小在计算机无法显示,将U盘插入Win10计算机后不显示可用容量,无法打开无法读取,如何解决...
- 【TensorFlow基础操作笔记】图+对话+张量+变量+线性回归实例
- 【镀金与沉金工艺的区别,今后得选“沉金”】