暂无连接

数列

【题目描述】

小Q和小C是好朋友。

小Q喜欢数列。有一天,他心血来潮,写下了三个长度均为nnn的数列。

小C也很喜欢数列。但是他只喜欢其中一种,波动数列。

小C把他的喜好告诉了小Q。小Q便打算找出这三个数列内的最长波动数列。

也就是说,如果我们将三个数列记做a[n][3]a[n][3]a[n][3],他必须要构造一个二元组序列:(p[i],q[i])(p[i], q[i])(p[i],q[i]),使得对于任何i>1i>1i>1有:

p[i]>p[i−1]p[i]>p[i-1]p[i]>p[i−1]

若q[i]=0,a[p[i]][q[i]]≥a[p[i−1]][q[i−1]]q[i]=0,a[p[i]][q[i]]≥a[p[i-1]][q[i-1]]q[i]=0,a[p[i]][q[i]]≥a[p[i−1]][q[i−1]]

若q[i]=2q[i]=2q[i]=2,只要保持段内同向即可(就是对于连续的一段q[i]=2q[i]=2q[i]=2,要么都有a[p[i]][q[i]]≥a[p[i−1]][q[i−1]]a[p[i]][q[i]]≥a[p[i-1]][q[i-1]]a[p[i]][q[i]]≥a[p[i−1]][q[i−1]],要么都有a[p[i]][q[i]]≤a[p[i−1]][q[i−1]]a[p[i]][q[i]]≤a[p[i-1]][q[i-1]]a[p[i]][q[i]]≤a[p[i−1]][q[i−1]])。

小Q希望这个二元组序列尽可能长。

提示:当q[i]!=q[i−1]q[i]!=q[i-1]q[i]!=q[i−1]时,数列的增减性由q[i]q[i]q[i]而非q[i−1]q[i-1]q[i−1]决定。

【简版题意】

小Q拿到一个3×n3×n3×n的数组,要在每一列选一个数(或者不选),满足以下条件:

(1)如果在第一行选,那它必须大于等于上一个数

(2)如果在第二行选,那么必须小于等于上一个数

(3)如果在第三行选,对于连续的一段在第三行选的数,必须满足方向相同(都小于等于上一个数或者都大于等于上一个数)

【输入】

输入包含444行,第一行包含一个整数nnn表示数列长度,第2、3、42、3、42、3、4行每行nnn个整数,分别表示三个数列。

【输出】

输出仅包含一个整数,即最长波动数列的长度。

【输入样例】

6
1 2 3 6 5 4
5 4 3 7 8 9
1 2 3 6 5 4

【输出样例】

6

【提示】
【样例解释】

取第三行1231\ 2\ 31 2 3(增),然后取第111行666(增),然后取第三行545\ 45 4(减),长度为666。

【数据规模和约定】

对于20%20\%20%的数据,n≤10,m≤1000n≤10,m≤1000n≤10,m≤1000;
对于60%60\%60%的数据,n≤1000,m≤1000n≤1000,m≤1000n≤1000,m≤1000;
对于100%100\%100%的数据,n≤100,000,m≤109n≤100,000,m≤10^9n≤100,000,m≤109;

其中m=max∣a[i]∣m=max|a[i]|m=max∣a[i]∣。

题解

这道题的题面是真的有毒,完整题面没说q[i]=1q[i]=1q[i]=1的情况,简版题面又没说选选连续第三行的时候增减性要考虑第一个第三行前面的数。。。

读懂题面以后这道题就变得简单起来,dp[i][1]dp[i][1]dp[i][1]表示选第iii列第一行为结尾的最长长度,dp[i][2]dp[i][2]dp[i][2]同理,dp[i][3]dp[i][3]dp[i][3]表示选第三行并且单增,dp[i][4]dp[i][4]dp[i][4]表示单减。暴力转移是O(n2)O(n^2)O(n2)的,发现转移时查询的实际上是值域最大值,所以开一棵值域线段树即可O(log⁡n)O(\log n)O(logn)转移。

代码
#include<bits/stdc++.h>
#define ls v<<1
#define rs v<<1|1
using namespace std;
const int M=1e5+5;
int dp[M][5],a[M][5],data[M<<2],n,ans,q;
struct sd{int mx[M<<4];void up(int v){mx[v]=max(mx[ls],mx[rs]);}void add(int v,int le,int ri,int pos,int val){if(le==ri){mx[v]=max(mx[v],val);return;}int mid=le+ri>>1;if(pos<=mid)add(ls,le,mid,pos,val);else add(rs,mid+1,ri,pos,val);up(v);}int ask(int v,int le,int ri,int lb,int rb){if(lb<=le&&ri<=rb){return mx[v];}int mid=le+ri>>1,ans=0;if(lb<=mid)ans=ask(ls,le,mid,lb,rb);if(mid<rb)ans=max(ans,ask(rs,mid+1,ri,lb,rb));return ans;}
}sgt[4];
void in()
{scanf("%d",&n);for(int j=1;j<=3;++j)for(int i=1;i<=n;++i)scanf("%d",&a[i][j]),data[++q]=a[i][j];data[++q]=INT_MAX;
}
void ac()
{sort(data+1,data+1+q);q=unique(data+1,data+1+q)-data-1;for(int j=1;j<=3;++j)for(int i=1;i<=n;++i)a[i][j]=lower_bound(data+1,data+1+q,a[i][j])-data;for(int i=1;i<=n;++i){dp[i][1]=max(max(sgt[1].ask(1,1,q,1,a[i][1]),sgt[2].ask(1,1,q,1,a[i][1])),sgt[3].ask(1,1,q,1,a[i][1]))+1;dp[i][2]=max(max(sgt[1].ask(1,1,q,a[i][2],q),sgt[2].ask(1,1,q,a[i][2],q)),sgt[3].ask(1,1,q,a[i][2],q))+1;dp[i][3]=max(sgt[1].ask(1,1,q,1,a[i][3]),sgt[2].ask(1,1,q,1,a[i][3]))+1;dp[i][4]=max(sgt[1].ask(1,1,q,a[i][3],q),sgt[3].ask(1,1,q,a[i][3],q))+1;sgt[1].add(1,1,q,a[i][1],dp[i][1]),sgt[1].add(1,1,q,a[i][2],dp[i][2]),sgt[2].add(1,1,q,a[i][3],dp[i][3]),sgt[3].add(1,1,q,a[i][3],dp[i][4]);}for(int i=1;i<=n;++i)for(int j=1;j<=4;++j)ans=max(ans,dp[i][j]);printf("%d",ans);
}
int main(){in(),ac();}

[2018.10.15 T3] 数列相关推荐

  1. 【比赛报告】2018.10.15校赛[2015-9-13 NOIP模拟赛 by hzwer] NOIP练习赛卷十四

    比赛时间:2018.10.15 选手:lrllrl 用时:2h 得分:100+10+90=200 最初想法是一个背包问题.首先背包问题的模型肯定是不行的,但是我们可以列出状态转移方程后发现,每个状态决 ...

  2. 【一周头条盘点】中国软件网(2018.10.15~2018.10.19)

    每一个企业级应用的人都置顶了中国软件网 中国软件网为你带来最新鲜的行业干货 每周热点 ========= Gartner公布2019年十大战略科技发展趋势 全球领先的信息技术研究和顾问公司Gartne ...

  3. 2018.10.15 直播笔记

    1 直播课不允许无故迟到.早退,有事请假,签到由大家自行截图,并发到有道云笔记中,最后把有道云笔记链接发到专贴. 截图需要分4部分,课前5分钟内.下课前5分钟内.中途休息时以及随机不定时截图,要求把上 ...

  4. 顺无盘linux win10包,(2018.05.21)云更新2016正式版x86_2016.10.15.4976无盘xp-win7x32-x64-win10x64公包...

    官方2016.12.6更新版本修正各BUG (服务端支持x86 32位系统) Win10,ltsb企业版 2017.3.3更改三层地址,改善不配问题. 重新修改补丁,使其更稳定解决个别提示客户端配套问 ...

  5. 2018+黑苹果+vs+Linux,重点更新!完美黑苹果=Z370M+i5+RX590(硬解)10.15

    本帖最后由 cbw390179428 于 2020-3-13 21:10 编辑 先来张图给大家解解馋! 配置是 主板:微星Z370M CPU:i5-8600K 显卡:女装大佬RX590 内存:芝棋8G ...

  6. c语言程序设计实验指导交大答案,C语言程序设计实验指导_上交大_课前练习-改错-完善程序-课后练习参考答案--2018.10修改.doc...

    C语言程序设计实验指导_上交大_课前练习-改错-完善程序-课后练习参考答案--2018.10修改.doc 实验一 Visual C集成环境实验内容(一)程序改错1.(1)无法运行(2)将第二个C程序重 ...

  7. 10.15 lzxkj

    几天前写的,忘了放了,在此填坑 10月16的题我出的不写题解了 lzxkj 题目背景 众所不周知的是, 酒店之王 xkj 一个经常迷失自我的人 有一天, 当起床铃再一次打响的时候, TA 用 O(1) ...

  8. 【比赛报告】2018.10.11校赛[8-2情人节欢乐赛] NOIP练习赛卷十二

    比赛时间:2018.10.10 选手:lrllrl 成绩 100+100+100=300 用时:约1h T1 果实计数 显然易得,答案为 b n m o d    k b^n\mod k bnmodk ...

  9. 2018.10.9模拟赛

    2018.10.9模拟赛 T1 trade 正解:贪心 据说lyd讲过但并没有印象QAQ,考场上现推浪费了不少时间 其实就开个小根堆,每次把堆顶取出来看它是不是比当前的 a[i]a[i]a[i] 小, ...

  10. 10天精读掌握:计算机组成与设计COAD:Patterson and Hennessy 第6天 2018/10.31

    10天精读掌握:计算机组成与设计COAD:Patterson and Hennessy 第6天 2018/10.31 1. 第4次周计划概览 2. 今日学习成果 3. 今日时间表 4. 今日反思 5. ...

最新文章

  1. nyoj n-1位数
  2. 下排牙齿中间高两边低_不知道如何添加辅食?让宝宝牙齿数量来帮你忙(附食谱)...
  3. 2017年vb计算机考试,2017年计算机二级VB考试习题及答案
  4. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
  5. Windows和Linux双启动,并用在Windows下配置CoLinux启动
  6. sicily 1012. Stacking Cylinders
  7. Linux shell脚本启动 停止 重启jar包
  8. hash算法在日常活动中的应用
  9. [转载] Python集合set
  10. 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
  11. matlab arma 仿真,基于Matlab的ARMA模型时间序列分析法仿真
  12. [GIS原理] 10.2 空间插值
  13. 机器学习--PCA(主成分分析)
  14. Spring乱码问题解决
  15. DNS加速之“智能DNS”跟“双线加速”、“CDN加速”的区别
  16. android恢复 模式,Android Doze模式使用命令启用和恢复
  17. Springboot内嵌tomcat
  18. Keras实现两个优化器:Lookahead和LazyOptimizer
  19. 金山是微软VBA的正式授权用户
  20. 根据概率密度函数生成随机数的代码

热门文章

  1. DTP模型之一:(XA协议之一)XA协议、二阶段2PC、三阶段3PC提交
  2. SSH框架调用scrapy爬虫
  3. 原生 JavaScript 实现扫雷
  4. 清除localstorage
  5. linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
  6. Android基于代理的插件化思路分析
  7. Lucene的分析过程
  8. C# ToString
  9. 【spring源码分析】spring中类型转换器详解
  10. 与spring的整合