洛谷题目链接

动态规划$+$线段树

题目链接(洛谷)

首先,先要明确一点,当我们填了第$i$位时,自然下一位的符号也就出来了

那么我们可以分情况讨论:

$1、$当下一位是$>$时:我们可以建一棵权值线段树,维护区间最大值,查询时在$[1,val[i]-1]$中查询最大值来转移

$2、$当下一位是$=$时:我们也可以在线段树里多维护一个值(当然直接开个数组都行,可我懒得写$qwq$),查询就是单点查询了(当然我是不会再去写一个函数的$qwq$)

$3、$当下一位是$<$时:我们还是在线段树里多维护一个值,查询就在$[val[i]+1,maxn]$中查询就$ok$了

上面的工作做完后就要开始毁天灭地的输出方案了!!

真毒瘤

调了我好久,又爆空间的,整个人都不好了。。。

我们就像以往的$dp$一样记录路径,开数组存着,最后倒序输出就好(说得轻巧)

代码(本蒟蒻不太会打离散,但是不开$long long$居然没有$MLE$):

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 500001
#define M 1000001
#define ll int
using namespace std;
struct Node
{
ll v;
int id;
};
struct Tree
{
Node num[4];
}tr[M<<2];
int n,m,maxn,tot;
int val[N],opt[N],w[N],pre[N];
Node ans;
Node f[N];
Node max(Node a,Node b)
{
return a.v>b.v?a:b;
}
void Pushup(int rt,int op)
{
tr[rt].num[op]=max(tr[rt<<1].num[op],tr[rt<<1|1].num[op]);
}
void Update(int rt,int l,int r,int pos,Node c,int op)
{
if(l==r)
{
tr[rt].num[op]=max(tr[rt].num[op],c);
return;
}
int mid=l+((r-l)>>1);
if(pos<=mid)
Update(rt<<1,l,mid,pos,c,op);
else
Update(rt<<1|1,mid+1,r,pos,c,op);
Pushup(rt,op);
}
Node Search(int rt,int l,int r,int L,int R,int op)
{
if(L>R)
return (Node){0,0};
if(L<=l&&r<=R)
return tr[rt].num[op];
Node ret;ret.v=0;
int mid=l+((r-l)>>1);
if(L<=mid)
ret=max(ret,Search(rt<<1,l,mid,L,R,op));
if(mid<R)
ret=max(ret,Search(rt<<1|1,mid+1,r,L,R,op));
return ret;
}
void Print(int now)
{
if(!now)
return;
Print(pre[now]);
printf("%d ",w[now]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&val[i]),maxn=max(maxn,val[i]);
for(int i=1;i<=m;++i)
{
char in;
scanf(" %c",&in);
opt[i]=in=='<'?1:in=='='?2:3;
}
// for(int i=1;i<=m;++i)
// printf("%d ",opt[i]);
for(int i=1;i<=n;++i)
{
Node ans1=Search(1,1,maxn,1,val[i]-1,1);
Node ans2=Search(1,1,maxn,val[i],val[i],2);
Node ans3=Search(1,1,maxn,val[i]+1,maxn,3);
Node now=max(ans1,max(ans2,ans3));
now.v+=1;
w[++tot]=val[i];
pre[tot]=now.id;
Update(1,1,maxn,val[i],(Node){now.v,tot},opt[(now.v-1)%m+1]);
if(ans.v<now.v)
ans.v=now.v,ans.id=tot;
}
printf("%d\n",ans);
Print(ans.id);
return 0;
}

  

[POI2010]MOT-Monotonicity 2的更多相关文章

  1. [补档][Poi2010]Monotonicity 2

    [Poi2010]Monotonicity 2 题目 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. 选出一个长度为L的子序列(不要求连续),要求这个子序列 ...

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

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

  3. 【BZOJ2090/2089】[Poi2010]Monotonicity 2 动态规划+线段树

    [BZOJ2090/2089][Poi2010]Monotonicity Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k].选出一个长度 ...

  4. [Poi2010]Monotonicity 2 线段树

    这道题考试的时候先打了个dfs暴力.又打了个O(n²)的动规.然后竟然心血来潮拍了一下..明明知道过不去的...然后水了50分(20个测试点这么多啊啊啊啊). 因为它已经提前给你如果长度为i时下一位的 ...

  5. Poi2010 Monotonicity 2

    树状数组优化dp 可以证明最优解一定是通过之前的最优转移过来的,所以每一个点只需要保存以该节点为结尾的最长长度即可 对于不同符号,等于号维护数组,大于小于维护树状数组 #include<cstd ...

  6. Monotonicity 2[POI2010]

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

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

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

  8. BZOJ2090 : [Poi2010]Monotonicity 2

    设f[i]表示以i为结尾的最长的合法序列的长度,=号直接维护,<号和>号用两棵树状数组维护即可,时间复杂度$O(n\log n)$. #include<cstdio> #def ...

  9. bzoj2089&2090: [Poi2010]Monotonicity

    双倍经验一眼题... f[i][1/2]表示以i结尾,当前符号应该是</>的最长上升子序列, 用BIT优化转移就好 =的话就不用说了吧= = #include<iostream> ...

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

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

随机推荐

  1. WUSTOJ 1275: 男神的逆袭(Java)

    1275: 男神的逆袭 题目   计算两个日期相差的天数.更多内容点击标题. 分析   下面说一下我的思路(自己写的,无扩展性): 给定一个日期,首先计算这个日期是这一年的第多少天. 给定两个日期,直 ...

  2. 【5号课堂】scratch制作电子生日贺卡

    贺卡在我国的使用由来已久,在古代,上层士大夫有用名帖互相问候的习俗 唐宋以后,贺卡的名称及功能有所进步,称为”门状“或“飞帖“,到了明清,又叫“红单“.“贺年帖“等等,听着名字就知功能越来越世俗化,文 ...

  3. easyui实现树形菜单Tab功能、layout布局

    一:常见三种前端ui框架 在初学者入门的状态下,我们常见的前端框架有三种且都有自己的官方网站: 1.easyui:官方网站(http://www.jeasyui.net/) 基于jquery的用户页面 ...

  4. java异常那些事

    异常的基本定义: 异常情形是指阻止当前方法或者作用域继续执行的问题.在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因 ...

  5. MySQL 使用tee记录语句和输出日志

    在mysql命令行中,使用tee命令,可以记录语句和输出到指定文件.在debugging时会很有用.每执行一条语句,mysql都会讲执行结果刷新到指定文件.Tee功能只在交互模式生效. mysql&g ...

  6. 配置闪回恢复区开启归档,未配置清理归档脚本,数据库hang住

    问题现象,测试环境执行SQL hang住 enmo:/home/oracle/worksh dg.sh SQL*Plus: Release Production on Mon May :: Copyr ...

  7. 20-MySQL DBA笔记-可扩展的架构

    第20章 可扩展的架构 本章将为读者讲述可扩展的架构相关的知识和技术.可扩展的架构意味着这个架构伸缩性好,我们可以用更多的节点来提高吞吐率,而性能(响应时间)不会下降到不可接受的范围.互联网世界飞速发 ...

  8. SQL 遍历删除所有表的数据

    https://www.cnblogs.com/yige/p/5193253.html declare @sqlTabName varchar(100);-- 声明游标DECLARE C_Employ ...

  9. WeChat App Word

    chats:聊天:n werun:微信运动 contacts:联系人:n official accounts:官方账号(公众号) discover:发现:vi moments:片刻(朋友圈动态):n ...

  10. K2 BPM_快消零售连锁行业门店选址解决方案_十年专注业务流程管理系统

    >>>业务流程管理软件选型攻略  快消零售连锁行业门店选址解决方案   业内有句名言:“门店最重要的是什么?第一是选址,第二是选址,第三还是选址” 选址是一个很复杂的综合性商业决策过 ...