51nod 选择子序列

这道题是\(Bunny\)学长在给我们的模拟赛中的一道题。

食用单调栈,处理每个数\(a_i\)左右第一个比自己大的数的下标\(left_i\),\(right_i\),并且建两条有向边\((i,left_i)\),\((i,right_i)\)。处理完毕后得到一个\(DAG\)。

然后求此图的拓扑序。由于都是小数连大数,所以可以以\(a_i\)的值为关键字排序,\(sort\)后即得到此\(DAG\)的一个拓扑序。

求得拓扑序后,即可\(O(n)\) \(DP\) 求\(DAG\)最长链。最长链即为\(ans\)。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#define MAXN 100233
using namespace std;
struct qmq
{int id,x;
}a[MAXN];
int n;
struct qwq
{int id,x;
};
stack<qwq> x,y;
int l[MAXN],r[MAXN];
struct qvq
{int nex,to;
}e[MAXN<<1];
int tot=0,h[MAXN]={};
int f[MAXN];
inline void add(int u,int v)
{
//  printf("Edge:::%d %d\n",u,v);e[++tot].to=v;e[tot].nex=h[u];h[u]=tot;
}
bool cmp(qmq o,qmq t)
{return o.x<t.x;
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&a[i].x);a[i].id=i;}for (int i=1;i<=n;i++){while (!x.empty()&&x.top().x<=a[i].x){if (x.top().x==a[i].x){r[x.top().id]=0;x.pop();continue;}r[x.top().id]=i;x.pop();}x.push((qwq){i,a[i].x});}for (int i=n;i;i--){while (!y.empty()&&y.top().x<=a[i].x){if (y.top().x==a[i].x){l[y.top().id]=0;y.pop();continue;}l[y.top().id]=i;y.pop();}y.push((qwq){i,a[i].x});}for (int i=1;i<=n;i++){if (r[i]) add(i,r[i]);if (l[i]) add(i,l[i]);}sort(a+1,a+n+1,cmp);for (int i=1;i<=n;i++){
//      printf(":::::::::::::::%d\n",a[i].id);f[a[i].id]=max(f[a[i].id],1);for (int j=h[a[i].id];j;j=e[j].nex){f[e[j].to]=max(f[e[j].to],f[a[i].id]+1);}}int ans=-233333;for (int i=1;i<=n;i++){ans=max(ans,f[i]);}printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/Kan-kiz/p/11310225.html

51nod 1153 选择子序列相关推荐

  1. [BZOJ4553][TJOI2016HEOI2016]序列(CDQ分治)

    4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1202  Solved: 554 [ ...

  2. XIII Open Grodno SU Championship

    A. Alice in the Wonderland 按题意模拟. #include<stdio.h> #include<iostream> #include<strin ...

  3. BZOJ 4553: [Tjoi2016Heoi2016]序列

    #Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了 ...

  4. C++数据结构与算法 动态规划

    动态规划: 和贪婪算法一样,动态规划对一个问题的解是一系列的决策过程,贪婪算法依据贪婪准则,做出的每一个抉择都是不可撤回的,在动态规划中,需要考察一系列抉择,已确定一个最优抉择序列是否包含一个最优抉择 ...

  5. 五大常用算法一(回溯,随机化,动态规划)

    五大常用算法一(回溯,随机化,动态规划) 回溯算法 回溯法: 也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题 ...

  6. Dilworth定理

    Dilworth定理优化"序列的不下降子序列最少划分数" 应kAc的要求,写这篇文章.虽然告别竞赛了,但是帮助晚辈,特别是有可能成为我孙子的人,还是十分有意义的. 首先是定义. 偏 ...

  7. 内部排序算法全面总结

    排序的概念 排序,就是重新排列表中的元素,使表中的元素按照关键字有序的过程. 我所了解的 表 多半是顺序表,因为顺序表实现较为简单,但是链表结构同样可以实现很多排序算法. 定义中的元素一般指什么元素呢 ...

  8. C. Obtain The String(二分)

    Problem - 1295C - Codeforces 给你两个由小写拉丁字母组成的字符串s和t.此外,你还有一个最初为空的字符串z.你想让字符串z等于字符串t,你可以通过以下操作来实现:将s的任何 ...

  9. 涂鸦移动2021校招软件工程师测试题

    博主于2020.9.13日参加了涂鸦移动软件工程师的笔试,奈何实力不够,只解出了一道题,这些题网络上并没有原题,剩余两道我也会放上来(大佬们做出来可以放在评论区,或联系我注明版权放在博客中)与大家分享 ...

最新文章

  1. Ckeditor通过Ajax更新数据
  2. Promise--感性认知
  3. 浏览器打开位置服务器,如何启动http服务器,然后打开web浏览器?
  4. oracle+查询主机地址,oracle函数:获取Internet主机名和ip地址
  5. 解决SQLServer事物日志过大的方法
  6. [爬虫练习]爬取同程安全应急响应公开漏洞列表以及详情
  7. php银行卡三要素实名认证
  8. 护照扫描仪的应用环境解读 SDK数据
  9. 【网络工程】交换机各层作用,100路监控摄像是否_该采用核心交换机吗
  10. OpenGL PowerVR SDK 编译:Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB)
  11. 免费开源的api接口管理系统,移动时代首选接口管理平台-doclever
  12. Linux笔记之Debian 11(bullseye) 配置国内源
  13. 微信订阅号开发学习Wod
  14. python数据类型怎么打开_python数据类型详解
  15. 食物同时食用是否有害健康
  16. Android第一行代码-Fragment
  17. PostgreSQL 操作
  18. 高等代数 矩阵的运算(第4章)1 加法,数量乘法,矩阵乘法,一些特殊矩阵
  19. flash flash页面的的全屏展示
  20. 《缠中说禅108课》20:缠中说禅走势中枢级别扩张及第三类买卖点

热门文章

  1. 小程序支付的流程是什么?用户看到的一小步,其实是后台操作的一系列复杂流程
  2. Python3 Wgs84\gcj02\bd09\mercator\bd09mc坐标系转换与投影
  3. web crawler 抓某前程的小小tips(低调发育)
  4. 第一次写博客-C/C++软件开发工程师需要学习哪些东西?
  5. Java项目ssm企业工资管理系统源码
  6. 中国大学排名python爬虫_Python爬虫入门实例三之爬取软科中国大学排名
  7. 设计模式(二)The Observer Pattern(观察者模式)
  8. VHDL语言基础-数据类型及运算符
  9. 成都5日--成都-都江堰-青城山-西岭雪山1116
  10. 作业一:按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。