洛谷 P3928 Sequence
题目描述
小强喜欢数列。有一天,他心血来潮,写下了三个长度均为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.如果在第三行选,对于连续的一段在第三行选的数,必须满足方向相同(都小于等于上一个数或者都大于等于上一个数)
清晰版描述简直坑人。。。
思路非常明显,智障dp。状态转移方程不读错题的话简直秒出。之后考虑转移优化。显然,一个范围内的最大值可以用线段树维护,当然要事先吧数据离散化。代码很简单,二十分钟就可以敲完,然后我就爆了一个钟的空间23333
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000000+10
typedef long long LL;
int n,tot=,ans=,pos[][MAXN],dp[][MAXN],tr[][MAXN*];
LL a[][MAXN],b[MAXN*];
void pushup(int t,int k){tr[t][k]=max(tr[t][k<<],tr[t][k<<|]);}
void build(int t,int k,int l,int r){
tr[t][k]=;
if(l==r)return;
int mid=(l+r)>>;
build(t,k<<,l,mid);
build(t,k<<|,mid+,r);
}
void update(int t,int k,int l,int r,int p,int val){
if(l==r&&l==p){
tr[t][k]=val;
return;
}
int mid=(l+r)>>;
if(p<=mid)update(t,k<<,l,mid,p,val);
else update(t,k<<|,mid+,r,p,val);
pushup(t,k);
}
int query(int t,int k,int l,int r,int L,int R){
if(l>=L&&r<=R)return tr[t][k];
int mid=(l+r)>>;
if(R<=mid)return query(t,k<<,l,mid,L,R);
else if(L>mid)return query(t,k<<|,mid+,r,L,R);
else return max(query(t,k<<,l,mid,L,R),query(t,k<<|,mid+,r,L,R));
}
int main(){
//freopen("data.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=;i++)
for(int j=;j<=n;j++){
scanf("%lld",&a[i][j]);
b[++tot]=a[i][j];
}
sort(b+,b+tot+);
tot=unique(b+,b+tot+)-b,tot--;
for(int i=;i<=;i++)build(i,,,tot);
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
pos[i][j]=lower_bound(b+,b+tot+,a[i][j])-b; for(int i=;i<=;i++)update(i,,,tot,pos[i==?:i][],),dp[i][]=;
for(int i=;i<=n;i++){
for(int k=;k<=;k++)dp[k][i]=;
for(int k=;k<=;k++){
if(k==)
for(int j=;j<=;j++)
dp[k][i]=max(dp[k][i],query(j,,,tot,,pos[][i])+);
else if(k==)
for(int j=;j<=;j++)
dp[k][i]=max(dp[k][i],query(j,,,tot,pos[][i],tot)+);
else if(k==)
for(int j=;j<=;j++)
dp[k][i]=max(dp[k][i],query(j,,,tot,pos[][i],tot)+);
else
for(int j=;j<=;j++)
if(j!=)dp[k][i]=max(dp[k][i],query(j,,,tot,,pos[][i])+);
}
for(int k=;k<=;k++){
update(k,,,tot,pos[k==?:k][i],dp[k][i]);
ans=max(ans,dp[k][i]);
}
}
printf("%d\n",ans);
return ;
}
洛谷 P3928 Sequence的更多相关文章
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
- [洛谷P5136]sequence
题目大意:有$T(T\leqslant10^5)$组询问,每次求$A_n(n\leqslant10^{18})$:$$A_n=\left\lceil\left(\dfrac{\sqrt5+1}2\ri ...
- 洛谷P3928 SAC E#1 - 一道简单题 Sequence2
提交地址 题目背景 小强和阿米巴是好朋友. 题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强. ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷UVA12995 Farey Sequence(欧拉函数,线性筛)
洛谷题目传送门 分数其实就是一个幌子,实际上就是求互质数对的个数(除开一个特例\((1,1)\)).因为保证了\(a<b\),所以我们把要求的东西拆开看,不就是\(\sum_{i=2}^n\ph ...
- 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)
题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...
- 洛谷P1432 倒水问题(CODEVS.1226)
To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...
- 洛谷P3459 [POI2007]MEG-Megalopolis [树链剖分]
题目传送门 MEG 题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postma ...
- [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns
洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...
随机推荐
- angular2安装笔记
主要摘自:http://www.runoob.com/angularjs2/angularjs2-typescript-setup.html http://blog.csdn.net/lgpwwa/a ...
- poj 2566 Bound Found
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4384 Accepted: 1377 Spe ...
- Group(), Groups(),& Groupdict()
group() 返回一个或多个匹配的字串.如果只有一个参数,结果只有单个字符串:如果有多个参数,结果是一个元组,元组里每一项对应一个参数.没有参数,group1默认是0(整个匹配串被返回).如果gro ...
- AngularJS学习篇(十三)
AngularJS HTML DOM ng-disabled 指令 ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性. <!DOCTYPE html> ...
- RobotFramework自动化测试框架-移动手机自动化测试Get Element Location关键字的使用
Get Element Location关键字用来获取一个Element的Location位置,该关键字接收一个参数[ locator ] 示例1:使用Get Element Location来获取一 ...
- Fiddler手机抓包图文教程
上篇Fiddler教程,我们教了大家Fiddler安装配置及如何使用Fiddler进行基本的Http抓包及模拟请求,今天给大家介绍下如何使用Fiddler进行手机抓包. 运行环境为Windows 10 ...
- JavaScript系列----面向对象的JavaScript(1)
1.面向对象的编程 1.1.什么是面向对象编程 面向对象编程:即是把能够完成独立完成一部分功能的代码封装在一起,组成一个类. 举个例子来说: 这里有一把枪, 枪的种类很多,有步枪,机关枪,阻击枪... ...
- Celery 源码解析三: Task 对象的实现
Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...
- Docker Register安装与基本认证
准备 基本事项 Docker环境 登录授权方式 镜像存放地址 HTTPS外网访问 启动Docker Registry 1. 基本事项 本篇涉及到的数据文件都放在/data目录下, 其中会有三个子目录 ...
- Python 面向对象(二) 特殊方法
一些Python特殊方法的汇总 __bases__ 类的基类,返回元祖__base__ 类的基类,也叫父类__call__ '类名()',类名加括号调用时执行的语句__class__ 对象或类 ...