洛谷 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 ...
随机推荐
- ubuntu-17.10 安装 FANN
因为想用C语言写神经网络,不用已有的库的话,又太难了,所以准备安装一个夸平台的FANN库, 源文件下载地址http://leenissen.dk/fann/wp/download/,我下载的是最新 ...
- linux GCC 编译多个.c/.h文件
基本认识: #include <xxx>:首先去系统目录中找头文件,如果没有在到当前目录下找.像标准的头文件 stdio.h.stdlib.h等用这个方法. #include " ...
- HDU1005 Number Sequence (奇技淫巧模拟)
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...
- 一款超好用轻量级JS框架——Zepto.js(上)
前 言 絮叨絮叨 之前我们介绍过JQuery怎么自定义一个插件,但没有详细介绍过JQuery,那么今天呢....我们还是不说JQuery,哈哈哈哈 但是今天我们介绍一款和JQuery超级像的一 ...
- SQL基本查询_多表查询(实验三)
SQL基本查询_多表查询(实验三) 题目要求(一) 针对emp.dept两表完成如下查询,并验证查询结果的正确性 使用显式内连接查询所有员工的信息,显示其编号.姓名.薪水.入职日期及部门名称: 使用隐 ...
- 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解
<javascript高级程序设计>跨浏览器事件处理程序EventUtil.js个人注释 EventUtil.js // 跨浏览器事件处理程序封装 var EventUtil = { // ...
- 二:Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...
- asp .net连接打开数据库初步
1 #endregion59 WebDriver
- 用C#生成不重复的随机数
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机不 可 ...
- 谈谈我的移动端rem适配方案
最近有点怀疑人生,毕竟一个人写前端,有时候会怀疑自己理解的一些东西包括用法有没有符合标准.趁着这阵子闲下来,翻了翻别人的rem适配博客,发现有点绕口,怪自己是个强迫症,啥都要自己去试试结果并从中理解, ...