【BZOJ2090/2089】[Poi2010]Monotonicity

Description

给出N个正整数a[1..N],再给出K个关系符号(>、<或=)s[1..k]。
选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]。
求出L的最大值。

Input

第一行两个正整数,分别表示N和K (N, K <= 500,000)。
第二行给出N个正整数,第i个正整数表示a[i] (a[i] <= 10^6)。
第三行给出K个空格隔开关系符号(>、<或=),第i个表示s[i]。

Output

一个正整数,表示L的最大值。

Sample Input

7 3
2 4 3 1 3 5 3
< > =

Sample Output

6

题解:一开始没看到不要求连续,以为是一道KMP的裸题。。。

我们令f[i]表示第i个数最多能成为子序列的第f[i]项,所以当我们确定f[i]后,i的下一项和i的关系是确定的,所以我们考虑如何实现查询

我们根据三种关系,维护2个权值线段树和一个数组,分别对应>,<,=。=我就不说了,我们以<举例

如果f[i]对应的符号是<,那么我们将它放到<所对应的权值线段树中,权值线段树上v[i]位置的值就是f[i],然后在枚举到j的时候,就查询[1,v[j]-1]上f[]的最大值,再+1就能更新f[j]

#include <cstdio>
#include <iostream>
#include <cstring>
#define lson x<<1
#define rson x<<1|1
using namespace std;
int t[500010],v[500010],f[500010];
char str[5];
int n,m,nm,ans;
struct SAG
{
int sm[4000010];
void pushup(int x)
{
sm[x]=max(sm[lson],sm[rson]);
}
void updata(int l,int r,int x,int p,int v)
{
if(l==r)
{
sm[x]=v;
return ;
}
int mid=l+r>>1;
if(p<=mid) updata(l,mid,lson,p,v);
else updata(mid+1,r,rson,p,v);
pushup(x);
}
int query(int l,int r,int x,int a,int b)
{
if(a>b) return 0;
if(a<=l&&r<=b) return sm[x];
int mid=l+r>>1;
if(b<=mid) return query(l,mid,lson,a,b);
if(a>mid) return query(mid+1,r,rson,a,b);
return max(query(l,mid,lson,a,b),query(mid+1,r,rson,a,b));
}
}s[2];
int s2[1000010];
int max(int a,int b,int c)
{
return max(max(a,b),c);
}
int main()
{
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++) scanf("%d",&v[i]),nm=max(v[i],nm);
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]=='>') t[i]=0;
if(str[0]=='<') t[i]=1;
if(str[0]=='=') t[i]=2;
}
for(i=1;i<=n;i++)
{
f[i]=max(s[0].query(1,nm,1,v[i]+1,nm),s[1].query(1,nm,1,1,v[i]-1),s2[v[i]])+1;
ans=max(ans,f[i]);
j=t[(f[i]-1)%m+1];
if(j==2) s2[v[i]]=max(f[i],s2[v[i]]);
else s[j].updata(1,nm,1,v[i],f[i]);
}
printf("%d",ans);
return 0;
}

【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树的更多相关文章

  1. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  2. #14 [BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity

    题解: 首先想到了标算..然后证明了一发是错的(事实证明很智障) 先说正确性比较显然的O(n^2)算法 令f[i][j]表示前i个物品,匹配到第j个括号,最大值是多少 g[i][j]表示前i个物品,匹 ...

  3. [BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity 树状数组优化dp

    这个dp乍看不科学,仔细一看更不科学,所以作为一个执着BOY,我决定要造数据卡死波兰人民,但是我造着造着就......证出来了......... 这个就是把 < > =分开讨论每次找到f[ ...

  4. BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树

    BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意:  约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...

  5. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  6. Codeforces 834D The Bakery - 动态规划 - 线段树

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  7. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  8. 【BZOJ3939】[Usaco2015 Feb]Cow Hopscotch 动态规划+线段树

    [BZOJ3939][Usaco2015 Feb]Cow Hopscotch Description Just like humans enjoy playing the game of Hopsco ...

  9. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)

    相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对.也即要将原序列划分成两个单增序列.由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉. 这个 ...

随机推荐

  1. Python-文件修改器

    #-*- coding: utf-8 -*- import os import sys import glob from PyQt4.QtGui import * from PyQt4.QtCore ...

  2. Struts2对于i18n的支持

    struts.xml中可以配置 <constant name="struts.custom.i18n.resources" value="itcast"& ...

  3. Atitit.分区对索引的影响 分区索引和全局索引 attilax总结

    Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, ...

  4. Itunes connect上传应用视频 app preview时遇到“无法载入文件”的问题

    总结一下,上传视频的一个经验吧,在使用safari进行上传的时候,有时出现了问题,上传失败,但是提示语只有一句“无法载入文件,请再次尝试”.这样的提示并不能提供更多的信息,为什么视频无法上传.有这样的 ...

  5. layui当点击增加的时候,将form中的值获取的添加到table行中代码

    layui.use(['table','layer'],function(){ var $=layui.$, table=layui.table, layer=layui.layer; functio ...

  6. linux学习笔记22--命令ln

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  7. hdu5745 La Vie en rose 巧妙地dp+bitset优化+滚动数组减少内存

    /** 题目:hdu5745 La Vie en rose 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5745 题意:题目给出的变换规则其实就是交换相邻 ...

  8. JDK8集合的便捷操作

    JDK8新特性,stream相关操作.把集合转换成stream,再对其进行相关操作,加上lambada表达式. demo: List<String> list = Arrays.asLis ...

  9. python 学习笔记 if语句

    一.if语句的格式 语句块必须有相同的缩进. 语句块必须比if,elif,else多一层缩进 # 如果条件成立则执行语句块1, # 否则 如果条件2成立则执行语句块2 # 其他情况执行语句块3 # e ...

  10. C语言编写的PHP框架--yaf入门编程

    首先--添加dll,修改php.ini--不同的版本,不同的需求 其次,根据教程http://www.laruence.com/manual/tutorial.firstpage.html#tutor ...