题目

给出\(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. pikachu sql inject 宽字节注入

    宽字节注入原理 什么是宽字节? 如果一个字符的大小是一个字节的,称为窄字节: 如果一个字符的大小是两个字节的,成为宽字节: 像GB2312.GBK.GB18030.BIG5.Shift_JIS等这些编 ...

  2. 【LeetCode哈希表】前k个高频词,利用哈希表+vector进行排序操作

    前k个高频词 https://leetcode.cn/problems/top-k-frequent-words/ 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词. ...

  3. mongo重启、远程连接

    1.查看当前mongo启动进程 ps -ef | grep mongo 2.修改mongo启动远程连接配制文件 vi /etc/mongod.conf 将 bind_ip=127.0.0.1 这一行注 ...

  4. 【Azure 应用服务】App Service 项目部署成功后,应用连接 Azure Redis时报错 Could not get a resource from the pool

    问题描述 App Service 项目部署成功后,需要连接到同在云上的Redis服务, Redis启动了专用终结点,只能在于Redis同一个VNET(虚拟网络)的资源能够访问.在进入App Servi ...

  5. 利用Linux自动编译Vivado工程

    https://codetd.com/article/12458043. 利用Linux自动编译Vivado工程

  6. 我为什么使用Linux做开发

    系统选择 目前市面上主流的桌面操作系统在大多数人眼里只有Windows和MacOS,那为什么我没选择它们两呢? 首先,不选MacOS的原因,就是太贵.当然这是我的原因不是苹果的原因,我最早使用Linu ...

  7. Zabbix“专家坐诊”第192期问答汇总

    问题一 Q:请问下,客户机snmptrap发告警为啥server web收不到,关键是snmptrap日志已经收到,zabbix server配置以及开启snmptrap=1 snmptrap=var ...

  8. tapable - webpack 的 hooks - getAc - 异步流程控制

    tapable - webpack 的 hooks,类似自己的 getAc 官方地址 https://www.npmjs.com/package/tapable 随便找了篇文章:聊聊 Webpack ...

  9. 基于4G的智能工牌解决方案特色解析

    前记  随着数字化的不断发展以及cat1模块的竞争加剧.cat1无论从成本或者功耗上,都进化的特别快.这样的前提下,让基于4G可穿戴产品逐渐成为现实可穿戴产品必备.能解决以前很多不能解决的问题.  作 ...

  10. 巧用Maya轴心操作小技巧,工作事半功倍!

    Maya 是一款专业的三维软件,可以用于创建规模宏大的世界.复杂的角色和炫酷的特效.Maya的用户遍布动画行业.影视特效.广告和片头.平面设计行业,用户数量十分庞大.本文分享了maya轴心操作的小技巧 ...