题目

给出\(N\)个正整数\(a[1..N]\),再给出\(K\)个关系符号(>、<或=)\(s[1..k]\)。

选出一个长度为\(L\)的子序列(不要求连续),要求这个子序列的第\(i\)项和第\(i+1\)项的的大小关系为\(s[(i-1)mod K+1]\)。

求出\(L\)的最大值。并输出一组具体方案。


分析

设\(dp[i]\)表示以\(i\)结尾的\(L\)的最大值,

则\(dp[i]=\max\{dp[j]+1\}\)

可以发现偏序关系实则是由\(dp[j]\)来决定的,

而且更小的\(dp[j]\)不能够影响\(i\)以后的选择

对于小于号和大于号开两个树状数组记录最大的\(dp[j]\),

等于号就直接记录上一次出现的位置即可


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=500011; char p[N];
int dp[N],n,m,k,b[N],a[N],pre[N],ans,pos[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void dfs(int n){
if (!n) return;
dfs(pre[n]);
print(b[a[n]]),putchar(32);
}
struct Tree_Array{
int c[N];
inline void update(int x,int y){
for (;x<=k;x+=-x&x)
if (dp[c[x]]<dp[y])
c[x]=y;
}
inline signed query(int x){
rr int ans=0;
for (;x;x-=-x&x)
if (dp[ans]<dp[c[x]])
ans=c[x];
return ans;
}
}c0,c1;
signed main(){
n=iut(); m=iut();
for (rr int i=1;i<=n;++i) b[i]=a[i]=iut(),dp[i]=1;
sort(b+1,b+1+n),k=unique(b+1,b+1+n)-b-1;
for (rr int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+k,a[i])-b;
for (rr int i=1;i<=m;++i){
rr char ch=getchar();
while (ch!='<'&&ch!='>'&&ch!='=') ch=getchar();
for (rr int j=i;j<=n;j+=m) p[j]=ch;
}
for (rr int i=1,j;i<=n;++i){
if (dp[i]<dp[j=c0.query(a[i]-1)]+1) dp[i]=dp[j]+1,pre[i]=j;
if (dp[i]<dp[j=c1.query(k-a[i])]+1) dp[i]=dp[j]+1,pre[i]=j;
if (dp[i]<dp[j=pos[a[i]]]+1) dp[i]=dp[j]+1,pre[i]=j;
if (p[dp[i]]=='<') c0.update(a[i],i);
if (p[dp[i]]=='>') c1.update(k-a[i]+1,i);
if (p[dp[i]]=='=') pos[a[i]]=i;
if (dp[ans]<dp[i]) ans=i;
}
print(dp[ans]),putchar(10),dfs(ans);
return 0;
}

#树状数组,dp#洛谷 3506 [POI2010]MOT-Monotonicity 2的更多相关文章

  1. 树状数组【洛谷P3586】 [POI2015]LOG

    P3586 [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1 ...

  2. 模板:二维树状数组 【洛谷P4054】 [JSOI2009]计数问题

    P4054 [JSOI2009]计数问题 题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 ...

  3. codeforces 597C (树状数组+DP)

    题目链接:http://codeforces.com/contest/597/problem/C 思路:dp[i][j]表示长度为i,以j结尾的上升子序列,则有dp[i][j]= ∑dp[i-1][k ...

  4. hdu 4622 Reincarnation trie树+树状数组/dp

    题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...

  5. Codeforces 597C. Subsequences (树状数组+dp)

    题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长 ...

  6. HDU2227Find the nondecreasing subsequences(树状数组+DP)

    题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1&l ...

  7. CodeForces - 314C Sereja and Subsequences (树状数组+dp)

    Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ...

  8. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  9. [Codeforces261D]Maxim and Increasing Subsequence——树状数组+DP

    题目链接: Codeforces261D 题目大意:$k$次询问,每次给出一个长度为$n$的序列$b$及$b$中的最大值$maxb$,构造出序列$a$为$t$个序列$b$连接而成,求$a$的最长上升子 ...

  10. 【XSY2727】Remove Dilworth定理 堆 树状数组 DP

    题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些 ...

随机推荐

  1. Kotlin return@xxx 的坑

    Kotlin Return 到标签 先看例子: (1..5).forEach { if (it == 3) { return@forEach } println(it) } println(" ...

  2. 第135篇:Three.js基础入门

    好家伙,这东西太帅了,我要学会   先放张帅图(都是用three.js做出来的,这我学习动力直接拉满)    还有另外一个 Junni is... 帧数太高,录不了   开始学习 官方文档 1.Thr ...

  3. 【Azure Function App】遇见无法加载Microsoft.Azure.WebJobs.ParameterBindingData的问题

    问题描述 新部署Azure Funciton代码,遇见无法加载 "Microsoft.Azure.WebJobs.ParameterBindingData" 问题 错误消息:Mic ...

  4. 【Azure 应用服务】如何关掉App Service/Function App的FTP部署, 使之变成FTPS

    问题描述 如何关掉App Service/Function App的FTP部署, 使之变成FTPS方式呢? 问题解答 在应用服务/函数应用的配置下选择右边的常规设置,然后修改FTP状态为"仅 ...

  5. C++ //排序案列 //描述:将person自定义数据类型进行排序,Person中有属性 姓名,年龄,身高 //排序规则: 按照年龄进行的升序,如果年龄相同按照身高进行降序

    1 //排序案列 2 //描述:将person自定义数据类型进行排序,Person中有属性 姓名,年龄,身高 3 //排序规则: 按照年龄进行的升序,如果年龄相同按照身高进行降序 4 5 #inclu ...

  6. centos 8远程分发复制jdk到另一个虚拟机

    在localzly节点操作成功后可以使用远程复制命令将JDK远程复制到slave1节点之中:(此命令在localzly中操作) scp -r /usr/java root@slave1:/usr/ 配 ...

  7. 【译】32位 .NET Framework 项目的 WinForm 设计器选择

    在客户反馈的推动下,Visual Studio 2022 向64位架构过渡,标志着增强开发体验的关键一步.正如 Klaus Loffelmann 在他的博客文章中所描述的那样,这种转换增强了整体性能和 ...

  8. Docker:Failed to copy files, no space left on device

    主页 个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 问题描述 在Mac上进行docker构建时,偶尔会遇到以下问题 Fai ...

  9. 将本地文件上传到github仓库

    将本地文件上传到github空仓库 本地使用git上传文件: 第一步:在需要的文件夹(文件夹里已经放了需要提交的内容)右击git bash,输入git init 第二步:将本地文件上传到本地git仓库 ...

  10. Zabbix技术分享——zabbix命令详解

    在与IT运维的小伙伴交流过程中不少人问到了zabbix_agentd.zabbix_proxy等命令的具体使用问题,为此这一期内容我们来聊聊Zabbix相关命令,其中包括zabbix_server.z ...