提交地址

题目背景

小强和阿米巴是好朋友。

题目描述

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

阿米巴也很喜欢数列。但是他只喜欢其中一种,波动数列。

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

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

p[i] > p[i-1]

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

若q[i] = 1,a[p[i]][q[i]] <= a[p[i-1]][q[i-1]]

若q[i] = 2,只要保持段内同向即可(就是对于连续的一段q[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]])。

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

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

清晰版题目描述

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

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

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

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

输入输出格式

输入格式:

输入包含4行。

第一行一个数n,表示数列长度。

第2、3、4行,每行n个整数,分别表示三个数列。

输出格式:

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

输入输出样例

输入样例#1:

6
1 2 3 6 5 4
5 4 3 7 8 9
1 2 3 6 5 4
输出样例#1:

6

说明

对于20%的数据,n <= 10, m <= 1000

对于60%的数据,n <= 1000, m <= 1000

对于100%的数据, n <= 100000, m <= 1000000000

其中m = max|a[i]|

样例解释:

取第三行1 2 3(增),然后取第1行6(增),然后取第三行5 4(减),长度为6。

思路:

  首先可以用dp作。

  把第三个序列,改成两条。除了这两条之间,这四条中任意两条之间可以互穿。(当然也可以在本序列上跳)

  每次转移都是,从4×(i-1)的矩阵中找序列值符合大小关系,且dp值最大的,来扩展。

  时间复杂度O(4*n^2)

#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
const int M=1e5+;
int a[M][],f[M][];
int n,ans;
int main()
{
cin>>n;
for(int i=;i<=n;i++) scanf("%d",&a[i][]);
for(int i=;i<=n;i++) scanf("%d",&a[i][]);
for(int i=;i<=n;i++) scanf("%d",&a[i][]),a[i][]=a[i][]; f[][]=f[][]=f[][]=f[][]=; for(int i=;i<=n;i++)
for(int j=;j<i;j++)
for(int k=;k<=;k++)
{
if(a[i][]>=a[j][k]&&f[j][k]+>f[i][]) f[i][]=f[j][k]+;
if(a[i][]<=a[j][k]&&f[j][k]+>f[i][]) f[i][]=f[j][k]+;
if(k!=&&a[i][]>=a[j][k]&&f[j][k]+>f[i][]) f[i][]=f[j][k]+;
if(k!=&&a[i][]<=a[j][k]&&f[j][k]+>f[i][]) f[i][]=f[j][k]+;
} for(int i=;i<=n;i++)
for(int k=;k<=;k++)
ans=max(ans,f[i][k]); cout<<ans;
}

60分代码

  要想有话的话,就要用到树结构了,我用树状数组做的。(为啥? 因为快啊!)

  当然,要用到多个树状数组,因为要对四个序列中每个序列单独求,而且序列一个算大于,一个算小于。

  时间复杂度O(n*logn)

#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
const int M=1e5+;
int n,m,tot,ans;
int a[M][],t[M*],c[][M*],f[M][];
int cnt;
inline void update(int id,int x,int v)
{
for(;x<=m;x+=x&(-x))
c[id][x]=max(c[id][x],v);
}
inline int query(int id,int x)
{
int ans=;
for(;x;x-=x&(-x))
ans=max(ans,c[id][x]);
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&a[j][i]);
t[++cnt]=a[j][i];
}
sort(t+,t+cnt+);
m=unique(t+,t+cnt+)-(t+); for(int i=;i<=;i++)
for(int j=;j<=n;j++)
a[j][i]=lower_bound(t+,t+m+,a[j][i])-t;
for(int i=;i<=n;i++)
{
f[i][]=max(f[i][],query(,a[i][])+);
f[i][]=max(f[i][],query(,a[i][])+);
f[i][]=max(f[i][],query(,a[i][])+);
f[i][]=max(f[i][],query(,a[i][])+); f[i][]=max(f[i][],query(,a[i][])+);
f[i][]=max(f[i][],query(,a[i][])+);
f[i][]=max(f[i][],query(,a[i][])+); f[i][]=max(f[i][],query(,m-a[i][]+)+);
f[i][]=max(f[i][],query(,m-a[i][]+)+);
f[i][]=max(f[i][],query(,m-a[i][]+)+);
f[i][]=max(f[i][],query(,m-a[i][]+)+); f[i][]=max(f[i][],query(,m-a[i][]+)+);
f[i][]=max(f[i][],query(,m-a[i][]+)+);
f[i][]=max(f[i][],query(,m-a[i][]+)+); update(,a[i][],f[i][]);
update(,m-a[i][]+,f[i][]); update(,a[i][],f[i][]);
update(,m-a[i][]+,f[i][]); update(,a[i][],f[i][]);
update(,m-a[i][]+,f[i][]); update(,a[i][],f[i][]);
update(,m-a[i][]+,f[i][]); for(int j=;j<=;j++)
ans=max(ans,f[i][j]);
}
cout<<ans<<endl;
return ;
}

100分

洛谷P3928 SAC E#1 - 一道简单题 Sequence2的更多相关文章

  1. 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2

    [题目]洛谷10月月赛R1 提高组 [算法]递推DP+树状数组 [题解]列出DP递推方程,然后用树状数组维护前后缀和. #include<cstdio> #include<cstri ...

  2. P3928 SAC E#1 - 一道简单题 Sequence2

    题目背景 小强和阿米巴是好朋友. 题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强.小强便打算 ...

  3. 洛谷 P3927 SAC E#1 - 一道中档题 Factorial【数论//】

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  4. 洛谷P3929 SAC E#1 - 一道神题 Sequence1【枚举】

    题目描述 小强很喜欢数列.有一天,他心血来潮,写下了一个数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种:波动数列. 一个长度为n的波动数列满足对于任何i(1 <= i < n),均有: ...

  5. 洛谷-P3927 SAC E#1 - 一道中档题 Factorial

    原址 题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. ...

  6. [洛谷3930]SAC E#1 - 一道大水题 Knight

    Description 他们经常在一起玩一个游戏,不,不是星际争霸,是国际象棋.毒奶色觉得F91是一只鸡.他在一个n×n的棋盘上用黑色的城堡(车).骑士(马).主教(象).皇后(副).国王(帅).士兵 ...

  7. [洛谷P3927]SAC E#1 - 一道中档题 Factorial

    题目大意:求$n!$在$k(k>1)$进制下末尾0的个数. 解题思路:一个数在十进制转k进制时,我们用短除法来做.容易发现,如果连续整除p个k,则末尾有p个0. 于是问题转化为$n!$能连续整除 ...

  8. [洛谷P3929]SAC E#1 - 一道神题 Sequence1

    题目大意:给你一串数列,问你能否改变1个数或不改,使它变成波动数列? 一个长度为n的波动数列满足对于任何i(1 <= i < n),均有: a[2i-1] <= a[2i] 且 a[ ...

  9. 洛谷P3926 SAC E#1 - 一道不可做题 Jelly【模拟/细节】

    P3926 SAC E#1 - 一道不可做题 Jelly [链接]:https://www.luogu.org/problem/show?pid=3926 题目背景 SOL君(炉石主播)和SOL菌(完 ...

随机推荐

  1. python 多模块文件共享变量

    Python import 包的机制是,import进来的和默认的系统的module了,都放在sys.module这个字典里面. 多个py文件再次import的时候,会先去sys.module里面检查 ...

  2. CodeForces - 434D Nanami's Power Plant

    Codeforces - 434D 题目大意: 给定一个长为n的序列,序列中的第i为上的值\(x_i\),序列第i位上的值\(x_i\in[l_i,r_i]\),价值为\(f_i(x_i)\),其中\ ...

  3. hibernate学习五 Hibernate补充

    1  MiddleGenIDE可以生成映射类和映射文件. 2

  4. JavaScript高级程序设计学习笔记第十三章--事件

    事件冒泡: IE 的事件流,事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).例如: <!DOCTYPE html> <htm ...

  5. Aspose.words写表格时多出空格的问题

    通过aspose.words创建表格时,每一个表格总是有一个制表符,和空格差不多,经过查找原因如下: 我是先通过书签找到需要插入表格的位置,在这个位置开始写表格的操作.问题出在书签上,这个书签在创建的 ...

  6. hbase&nbsp;multiple&nbsp;SLF4J&amp;n…

    hbase multiple SLF4J bindings 警告 hbase shell 和命令操作中经常有个烦人的警告,说SLF4J有多个绑定: hbase(main):003:0> list ...

  7. Linux绘图函数

    gdk_draw_line () gdk_draw_rectangle () gdk_draw_arc () gdk_draw_polygon () gdk_draw_string () gdk_dr ...

  8. 使用的SQLServer版本不支持数据类型“datetime2“

    快速解决方法: 原因,在使用ado.net entity的时候,entity使用的数据库是sqlserver 2008, 但后来实际使用中使用的数据库是sqlserver 2005, 操作DateTi ...

  9. mock测试方法及实践改进

    此文已由作者翟曜授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. mock测试常见的定义为:在测试过程中,对于某些不易构造或不易获取的对象,通过创建虚拟对象的方式来模拟测试的测 ...

  10. Git 分支管理 创建与合并分支

    分支在实际中有什么用呢? 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了. 如果等代码全部写完再一次提交, ...