51nod 1153 选择子序列
这道题是\(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;
}
51nod 1153 选择子序列的更多相关文章
- 51nod 1202 不同子序列个数 [计数DP]
1202 子序列个数 题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 子序列的定义:对于一个序列a=a[1],a[2],.. ...
- 51nod 1202 不同子序列个数(计数DP)
1202 子序列个数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 子序列的定义:对于一个序列a=a[1],a[2],......a[n].则非空序列a'=a[p1],a ...
- 51nod——2504 是子序列的个数(一看就会的序列自动机原理)
还以为序列自动机是什么,写完无意间看到帖子原来这就是序列自动机……这算自己发现算法
- BZOJ4553: [Tjoi2016&Heoi2016]序列
Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所 ...
- BZOJ 4553 Tjoi2016&Heoi2016 序列
Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...
- XIII Open Grodno SU Championship
A. Alice in the Wonderland 按题意模拟. #include<stdio.h> #include<iostream> #include<strin ...
- HEOI2016解题报告
树 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记 ...
- 【BZOJ4553】【TJOI2016】【HEOI2016】序列
cdq和整体二分之间的关系好迷啊 原题: 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛 ...
- MIT molecular Biology 笔记8 RNA剪接
视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th edition J.D. Wat ...
- IRanges package
1)介绍 在分析序列时,我们通常对特定的连续子序列感兴趣. 例如,a矢量可以被认为是按字母顺序排列的小写字母序列. 我们将第一个五个字母(a到e)称为连续的子序列,而仅包含元音的子序列不会是连续的. ...
随机推荐
- 如何安装vm虚拟机软件并用该软件建立虚拟机
一.安装vm虚拟机软件 1.双击打开虚拟机应用程序 找到VM应用程序所在的位置,双击安装 2.根据向导安装 根据提示点击下一步 点击安装之后耐心等待一会,会出现需要输入许可证的的界面,这时候不要关闭界 ...
- visio任意图形填充
开发工具->操作->修剪->按住Shift键点击填充图形所有边 同时选中后->组合->开发工具->操作->连接 回到开始选项卡选择填充颜色 中途不要点击其他, ...
- sql学习笔记 - 1 数据库简介
数据库简介 """ 本学习笔记来自哔哩哔哩--老男孩Python全栈开发29期全套 https://www.bilibili.com/video/BV1QE41147hU ...
- cmake 实现交叉编译注意事项
(1)确保安装交叉编译工具安装成功 在终端输入arm-linux-gnueabihf-g++ -v 或 arm-linux-gnueabihf-gcc -v ,能看到相应交叉C编译器和C++编译器的版 ...
- Delphi数据库备份
此处代码只是测试代码,仅仅是测试 //环境:D7+SQL Server 2008 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, S ...
- 华为ME60 配置PPPOE-radius 业务
华为ME60 配置PPPOE-radius 业务 1.创建radius 认证 # radius-server source interface LoopBack0 radius-server grou ...
- Spyglass CDC工具使用(二)
最近一直在搞CDC (clock domain crossing) 方面的事情,现在就CDC的一些知识点进行总结. 做CDC检查使用的是Spyglass工具.以下内容转载自:Spyglass检查之CD ...
- bash transpose csv
transpose() { awk ' BEGIN { FS = ","; OFS = ","; } { if (max_nf<NF) max_nf=NF ...
- GO语言http请求方法,可以携带请求头Header与cookie
1.目录 2.main.go package main import "fmt" import "demo/common/http" func main() { ...
- docker安装pgsql
aliyun环境docker安装并使用postgres121.拉取postgres镜像docker pull postgres:12 2.检查现有镜像docker images 3.启动postgre ...