题目

给出\(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. 【Android 逆向】【攻防世界】boomshakalaka-3

    1. apk 安装到手机,是一个cocos2dx 写的打飞机的游戏 题目描述跟得分有关(题目描述: play the game, get the highest score) 2. jadx 打开ap ...

  2. python各版本新特性

    # py3.7 https://docs.python.org/zh-cn/3/whatsnew/3.7.html # py3.8 https://docs.python.org/zh-cn/3/wh ...

  3. java学生管理系统(界面版)

    运行截图 项目说明: 本系统界面我个人就从简设计了,本来打算使用windowbuilder插件设计的,可想到使用windowbuilder插件之后导致代码冗余,会影响到代码可读性,可能对小白不友好.虽 ...

  4. dotnet nuget的命令行上传(推送/发布)包到Nexus 3

    1.让Visual Studio在生成的时候也生成NuGet的包 在项目上点右键,选"属性",然后设置生成的时候制作NuGet的包. 英文版在这里打勾: 中文版在这里打勾: 重新生 ...

  5. 【Azure 应用服务】 在App Service中无法上传证书[Private Key Certificates (.pfx)],导入Azure Key Vault中的证书也无法成功

    问题描述 在App Service的TLS/SSL settings页面,切换到Private Key Certificates (.pfx),通过Import Key Vault Certifica ...

  6. 【Azure API 管理】APIM关闭开发者门户的办法

    问题描述 APIM默认提供了开发者门户,可以让用户体验如何来调用接口.但如果不想开发这个功能的情况下,是否有办法关闭呢? 问题解答 答案是:开发人员门户是没有办法关闭的.但是作为另一种的代替方案,如自 ...

  7. 浅入 ABP 系列教程目录汇总

    浅入ABP(1):搭建基础结构的 ABP 解决方案 https://www.cnblogs.com/whuanle/p/13675889.html 浅入ABP(2):添加基础集成服务 https:// ...

  8. SPFA最短路

    目录 从Bellman-Ford开始 核心思想 模拟算法执行过程 时间复杂度 模板 spfa spfa优化的思想 模板 从Bellman-Ford开始 对于所有边权都大于等于0的图,任意两个顶点之间的 ...

  9. Linux 系统进程管理

    Linux 系统进程管理 目录 Linux 系统进程管理 一.进程的概述 1.1 什么是进程? 1.2 进程和程序的区别 1.3 进程的生命周期 1.4 进程的运行过程 二. 静态显示进程状态-ps ...

  10. ThreadLocal父子间通信的四种解决方案

    ThreadLocal父子间通信的四种解决方案 ThreadLocal 是存储在线程栈帧中的一块数据存储区域,其可以做到线程与线程之间的读写隔离. 但是在我们的日常场景中,经常会出现父线程需要向子线程 ...