正题

题目链接:https://www.luogu.com.cn/problem/P4093


题目大意

nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同。

求所有情况下都满足的最长不降子序列


解题思路

定义maximax_imaxi​表示位置iii的最大数,minimin_imini​表示位置iii的最小数。

然后有转移方程fi=max{fj}+1(ai≥maxj,mini≥aj)f_i=max\{f_j\}+1(a_i\geq max_j,min_i\geq a_j)fi​=max{fj​}+1(ai​≥maxj​,mini​≥aj​)

可以发现这是一个三维偏序,用cdq分治+树状数组即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=1e5+10;
int n,m,a[N],b[N],s[N];
int t[N],p[N],f[N],ans;
bool cmp1(int x,int y)
{return b[x]<b[y];}
bool cmp2(int x,int y)
{return a[x]<a[y];}
void Change(int x,int val){while(x<=n){t[x]=max(t[x],val);x+=lowbit(x);}return;
}
void Clear(int x){while(x<=n){t[x]=0;x+=lowbit(x);}return;
}
int Ask(int x){int ans=0;while(x){ans=max(ans,t[x]);x-=lowbit(x);}return ans;
}
void cdq(int l,int r){if(l==r){f[l]=max(f[l],1);return;}int mid=(l+r)>>1;cdq(l,mid);for(int i=l;i<=r;i++)p[i]=i;sort(p+l,p+mid+1,cmp1);sort(p+mid+1,p+r+1,cmp2);int k=l;for(int i=mid+1;i<=r;i++){while(k<=mid&&b[p[k]]<=a[p[i]])Change(a[p[k]],f[p[k]]),k++;f[p[i]]=max(f[p[i]],Ask(s[p[i]])+1);}for(int i=l;i<=mid;i++)Clear(a[i]);cdq(mid+1,r);return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=s[i]=a[i];for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);b[x]=max(b[x],y);s[x]=min(s[x],y);}cdq(1,n);for(int i=1;i<=n;i++)ans=max(ans,f[i]);printf("%d",ans);
}

P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】相关推荐

  1. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  2. [cdq分治][树状数组] Bzoj P3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  3. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  4. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  5. P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3157 题目大意 一个长度为nnn序列,每次删除一个数,求删除前的逆序对数量. 解题思路 时光倒流之后,我们变为每 ...

  6. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

  7. [cdq分治][树状数组] Jzoj P4419 hole

    Description GFS打算去郊外建所别墅,享受生活,于是他耗费巨资买下了一块风水宝地,但令他震惊的是,一群DSJ对GFS的富贵生活深恶痛绝,决定打洞以搞破坏. 现在我们简化一下这个问题,在这片 ...

  8. hdu_5324_Boring Class(cdq分治+树状数组)

    题目链接:hdu_5324_Boring Class 题意: 给出n个二维点对,求LIS长度和编号字典序最小的LIS(x非增,y非减) 题解: dp[i]=max(dp[j]) (i>j,l[i ...

  9. Educational Codeforces Round 17 E. Radio stations cdq分治 + 树状数组

    传送门 文章目录 题意 思路: 题意 有nnn个电台,对于每个电台iii有三个参数xi,ri,fix_i,r_i,f_ixi​,ri​,fi​,分别指他们的坐标.作用半径.频率.如果两个电台频率差值在 ...

最新文章

  1. cambridge ifm strategic roadmapping takecontrol in times of uncerntainty
  2. 大数据开发上岗基本要求
  3. BZOJ4504. K个串(主席树+优先队列)
  4. Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)
  5. 信息安全工程师笔记-数字证书
  6. 简明 Vim 练级攻(转自coolshell)
  7. Linux全攻略--Apache服务器配置与管理(三)
  8. PGM:部分有向模型之条件随机场与链图模型
  9. 华为QoS中CBQ队列详解
  10. Selenium学习笔记||三、BeautifulSoup
  11. 算法(Java)——双指针
  12. 警告: A docBase inside the host appBase has been specified, and will be ignore
  13. 主观意义上第一个基于DEFI的DAM平台DIPPER,年关崛起的黑马究竟是否能在新年创造区块链新纪元?而DIPPER的意义和价值又是什么?
  14. 概率论:3.3期望与方差
  15. passive-interface OSPF 的被动接口
  16. 【信号调理】ADC保护电路/ADC缓冲器
  17. open-vot:PyTorch 实现 Siamese-FC
  18. 萌新小白萌新中软实习day7
  19. Python:json数据与Python对象之间的转换
  20. 历史上的一些“大”芯片回顾

热门文章

  1. docker 查看容器_Docker介绍
  2. 让对话框不显示边框_微信消息“无边框”模式搭配这款壁纸,简直绝了
  3. 独立主题需要有index.php模板文件,wordpress 主题模板文件列表及其作用
  4. pca 累积方差贡献率公式_机器学习数据降维方法:PCA主成分分析
  5. java pojo 是什么_什么是POJO
  6. 支持向量回归代码_RDKit:基于支持向量回归(SVR)预测logP
  7. oracle 如何筛选重复,求sql--筛选A字段相同,B字段不同且不重复的记录
  8. sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意
  9. 算法设计与分析——分治与递归策略——hanoi问题
  10. vs 2019 aspx灰色_蛇纹当道,豹纹在侧:穿成动物园是2019时尚大势?