BZOJ4553:[HEOI2016/TJOI2016]序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4553
佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可。注意:每种变化最多只有一个值发生变化。在样例输入1中,所有的变化是:
1 2 32 2 31 3 31 1 31 2 4选择子序列为原序列,即在任意一种变化中均为不降子序列
一道比较难的题?可能是我CDQ很久没写的缘故了……
设l[i]~r[i]表示i数的变动范围,考虑f[i]=max(f[j])+1,其中j要满足:
j<i
a[j]<=l[i]
r[j]<=a[i]
很显然是CDQ三维(?)偏序的模型,但是有四个变量,所以归并排序貌似不可做……
改一下变量名变成:
tj<ti
xj<=yi
zj<=xi
我们一维排t,二维mid左右两边分别排x和y,然后按照顺序类似归并排序把两边的x和y合在一起,再用树状数组维护第三维就好啦!
当然注意每次我们处理完别忘了要回归原位!
- #include<map>
- #include<cmath>
- #include<stack>
- #include<queue>
- #include<cstdio>
- #include<cctype>
- #include<vector>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- typedef long long ll;
- const int N=1e5+;
- const int MAX=1e5;
- inline int read(){
- int X=,w=;char ch=;
- while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
- while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
- return w?-X:X;
- }
- struct node{
- int x,y,z,t,ans;
- }a[N];
- int n,m,tr[N];
- inline int lowbit(int x){return x&(-x);}
- inline void add(int x,int y){
- for(int i=x;i<=MAX;i+=lowbit(i))tr[i]=max(tr[i],y);
- }
- inline int query(int x){
- int res=;
- for(int i=x;i;i-=lowbit(i))res=max(res,tr[i]);
- return res;
- }
- inline void mdy(int x){
- for(int i=x;i<=MAX;i+=lowbit(i))tr[i]=;
- }
- inline bool cmpt(node a,node b){
- return a.t<b.t;
- }
- inline bool cmpx(node a,node b){
- return a.x==b.x?a.t<b.t:a.x<b.x;
- }
- inline bool cmpy(node a,node b){
- return a.y==b.y?a.t<b.t:a.y<b.y;
- }
- void cdq(int l,int r){
- if(l>=r)return;
- int mid=(l+r)>>;
- cdq(l,mid);
- sort(a+l,a+mid+,cmpx);
- sort(a+mid+,a+r+,cmpy);
- for(int i=l,j=l,k=mid+;i<=r;i++){
- if(j<=mid&&(k>r||a[j].x<=a[k].y))add(a[j].z,a[j].ans),j++;
- else a[k].ans=max(a[k].ans,query(a[k].x)+),k++;
- }
- for(int i=l;i<=mid;i++)mdy(a[i].z);
- sort(a+mid+,a+r+,cmpt);
- cdq(mid+,r);
- }
- int main(){
- n=read(),m=read();
- for(int i=;i<=n;i++)a[i].x=a[i].y=a[i].z=read(),a[i].t=i;
- for(int i=;i<=m;i++){
- int x=read(),y=read();
- a[x].y=min(a[x].y,y);
- a[x].z=max(a[x].z,y);
- }
- for(int i=;i<=n;i++)a[i].ans=;
- cdq(,n);
- int ans=;
- for(int i=;i<=n;i++)ans=max(ans,a[i].ans);
- printf("%d\n",ans);
- return ;
- }
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ4553:[HEOI2016/TJOI2016]序列——题解的更多相关文章
- [BZOJ4553][HEOI2016/TJOI2016]序列
传送门 好像是DP再套个裸的CDQ? 树套树是不可能写树套树的,这辈子都不可能写树套树的 对于一个 \(i\) ,设它最小为 \(a_i\) ,原数为 \(b_i\) ,最大为 \(c_i\) \(f ...
- 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; ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告
P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 题解 P4093 【[HEOI2016/TJOI2016]序列】
这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 洛谷 P4093: bzoj 4553: [HEOI2016/TJOI2016]序列
题目传送门:洛谷P4093. 题意简述: 给定一个长度为 \(n\) 的序列 \(a\). 同时这个序列还可能发生变化,每一种变化 \((x_i,y_i)\) 对应着 \(a_{x_i}\) 可能变成 ...
- [HEOI2016/TJOI2016]序列
题解: 很水的题目 首先容易发现每个位置实际上只有最大值是有用的 然后把条件变成dp[i]=max(dp[j]+1)(j<i,F[i]>G[j],G[i]>H[j]) 然后我研究了一 ...
- 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[ ...
随机推荐
- How To Install Apache Tomcat 7 on CentOS 7 via Yum
摘自:https://www.digitalocean.com/community/tutorials/how-to-install-apache-tomcat-7-on-centos-7-via-y ...
- android学习十 ActionBar
1.api level大于等于11 支持,或者使用兼容库,但兼容库的问题很多. 2.一个操作栏属于一个活动,并具有其生命周期 3.操作栏分3类:a.选项卡操作栏,b.列表操作栏,c.标准操作栏 4.获 ...
- rn打包分析
rn打包原来是packager,后来独立出一个专门的打包工具metro,构建工具的大体思路跟前端构建工具差不多,都会有一个启动文件,然后根据模块依赖关系把对应文件找到. 开发中打包 在开发中打包,我们 ...
- 「日常训练」Paths and Trees(Codeforces Round 301 Div.2 E)
题意与分析 题意是这样的,定义一个从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 现在求一棵最短生成树,输出总边权和与选取边的编号. 我们首先要明白这样一个结论:对一个图求 ...
- hdu2037今年暑假不AC(贪心,活动安排问题)
今年暑假不AC Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- 怎样安装Appium
在浏览器地址栏输入 http://appium.io/ 打开Appium官网: 安装包下载完成后, 一路默认安装, 什么都不用点击, 等待大约10分钟: 安装完成后, 会在桌面生成快捷图标: 启动: ...
- 移动性能测试之gemebench安装
越来越多的人从事各种移动端性能测试,但工具和文档的资料却相对较少,这两天需要测试一款APP的性能,就来先简单介绍下gamebench的安装吧! 作为国人来说,使用gamebench还是有相当多的坑点: ...
- kettle_简单入门
简介 Kettle是一款纯Java开发的ETL工具,它是跨平台的,所以它可以在Window.Linux.Unix上运行.注意什么是ETL,读者可以自行百度了解,我的理解是将一个数据库的数据导入到另外一 ...
- HTML+JS = 网站注册界面源代码
本注册页面未设置编码方式和兼容性,已测试,在Chrome浏览器显示正常 <!DOCTYPE html> <html> <head> <title>注册页 ...
- [Clr via C#读书笔记]Cp8方法
Cp8方法 构造器 作用就是初始化所有成员字段:.ctor:派生类和基类都有自己的构造函数.默认有一个无参数的构造函数,值字段初始化为0,引用字段初始化为null:可以有多个构造器: 值类型的初始化其 ...