luogu1155 双栈排序
题目大意
运用两个栈的push和pop操作使得一个序列单调递增且操作字典序最小。$n\leq 1000$。
题解
本题我们要尝试运用“瞪眼法”,也就是推样例。我们显然要数字尽可能地推入第一个栈。那么问题就是:怎样的两个数字不可以在同一个栈中呢?这样的效果是:当一个数字a想要出栈时,其上端有个被他大的数字b挡着,且是不得不挡着。怎么会“不得不”呢?那是因为有一个数字c<a在b的上面(原序列中,c在b的右面),因为要想使输出序列递增,必须把b入了栈以后才能出栈。所以,a和c不能共存。将所有满足a、c这样的条件的点连边,进行二分图染色(进入栈的编号)(染不了色输出-1),然后模拟即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std; const int MAX_NODE = 1010, MAX_EDGE = MAX_NODE * MAX_NODE;
vector<char> Ops; struct Node;
struct Edge; struct Node
{
Edge *Head;
int Color;
}_nodes[MAX_NODE];
int TotNode;
Node *A[MAX_NODE];
stack<Node*> St[3]; struct Edge
{
Node *To;
Edge *Next;
}_edges[MAX_EDGE];
int _eCount; void Dfs(Node *cur, int color)
{
if (cur->Color && cur->Color != color)
{
printf("0\n");
exit(0);
}
if (cur->Color)
return;
cur->Color = color;
for (Edge *e = cur->Head; e; e = e->Next)
Dfs(e->To, color == 1 ? 2 : 1);
} void AddEdge(Node *from, Node *to)
{
Edge *e = _edges + ++_eCount;
e->To = to;
e->Next = from->Head;
from->Head = e;
} void Build(Node *u, Node *v)
{
AddEdge(u, v);
AddEdge(v, u);
} void BuildGraph()
{
static Node *AftMinV[MAX_NODE];
AftMinV[TotNode] = A[TotNode];
for (int i = TotNode - 1; i >= 1; i--)
AftMinV[i] = min(A[i], AftMinV[i + 1]);
for (int i = 1; i <= TotNode; i++)
for (int j = i + 1; j <= TotNode; j++)
if (A[i] < A[j] && AftMinV[j] < A[i])
Build(A[i], A[j]);
} int main()
{
scanf("%d", &TotNode);
for (int i = 1; i <= TotNode; i++)
{
int vId;
scanf("%d", &vId);
A[i] = _nodes + vId;
}
BuildGraph();
for (int i = 1; i <= TotNode; i++)
if (!A[i]->Color)
Dfs(A[i], 1);
Node *cur = _nodes + 1;
for (int i = 1; i <= TotNode; i++)
{
Ops.push_back(A[i]->Color == 1 ? 'a' : 'c');
St[A[i]->Color].push(A[i]);
while (!St[cur->Color].empty() && St[cur->Color].top() == cur)
{
St[cur->Color].pop();
Ops.push_back(cur->Color == 1 ? 'b' : 'd');
cur++;
}
}
for (unsigned int i = 0; i < Ops.size(); i++)
printf("%c ", Ops[i]);
printf("\n");
return 0;
}
luogu1155 双栈排序的更多相关文章
- Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】
Luogu1155 NOIP2008 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过 2个栈 S1 和 S2 ,Tom希望借助以下 44 种操作实现将输入序列升序排序. 操作 ...
- [luogu1155 NOIP2008] 双栈排序 (二分图染色)
传送门 Description Input 第一行是一个整数 n . 第二行有 n 个用空格隔开的正整数,构成一个 1−n 的排列. Output 共一行,如果输入的排列不是"可双栈排序排列 ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- noip2008 双栈排序
题目描述 Description \(Tom\)最近在研究一个有趣的排序问题.如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),\(Tom\)希望借助以下\(4\)种操作实现将输入序列升序排 ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
- 双栈排序(codevs 1170)
题目描述 Description Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈 ...
- #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 【NOIP2008】双栈排序
感觉看了题解还是挺简单的,不知道当年chty同学为什么被卡了呢么久--所以说我还是看题解了 原题: Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将 ...
随机推荐
- sublime text 快捷键记录
sublime常用快捷键 Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑) Ctrl+G 跳转到相应的行 Ctrl+J 合并行(已选择需要合并的多行时) Ctrl ...
- HashMap、ConcurrentHashMap以及HashTable(面试向)
---->HashMap 在java1.7中,hashmap的数据结构是基于数组+链表的结构,即我们比较熟悉的Entry数组,其包含的(key-value)键值对的形式.在多线程环境下,Hash ...
- leetcode-240搜索二维矩阵II
搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...
- 如何判断CPU、内存、磁盘的性能瓶颈?
1.如何判断CPU.内存.磁盘的瓶颈? CPU瓶颈1) 查看CPU利用率.建议CPU指标如下 a) User Time:65%-70% b) System Time:30%-35% c) Idle:0 ...
- 九度oj 题目1055:数组逆置
题目1055:数组逆置 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8225 解决:3932 题目描述: 输入一个字符串,长度小于等于200,然后将数组逆置输出. 输入: 测试数据有多组 ...
- 关于java对于大数处理的相关程序和用法
<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; l ...
- 常见问题:Linux安装Python3步骤、Windows无法利用pip
Linux安装python3.6和第三方库的步骤: 我的Linux是CentOS 6.5版本 Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7, ...
- 【HDOJ6146】Pokémon GO(DP,计数)
题意:一个2*n的矩阵,从任意一格出发,不重复且不遗漏地走遍所有格子,问方案数 mo 10^9+7 n<=10000 思路:因为OEIS搜出来的两个数列都是错误的,所以考虑DP 设B[i]为2* ...
- 2.5 3-way quickSort
1.排序时,数组含有大量重复元素,应该使用哪种排序手段? (1)mergeSort:与数组的特征无关,比较次数总是在1/2NlgN~NlgN之间 (2)quickSort:当所有的元素全都相同的时候, ...
- Webstrom打开太慢
让webstrom将安装包目录屏蔽,settings-搜索file types-在ignore file and folders加入node_modules目录,操作方式如下: