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种操作实现将 ...
随机推荐
- uglifyjs压缩批处理,.bat文件启动
我们不可能每次都打开cmd去键入压缩执行代码,容易写错不说(如上面那个结果图),还耗时,想想都会让人疯掉. 懒人有懒法,花了点功夫,折腾了一个批处理文件,以后,想要压缩JS,只要双击运行这个.bat文 ...
- [Luogu] P1865 A % B Problem
题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...
- HDU4415 Assassin’s Creed
题目大意:有n个人,每个人有x,y两个值.x代表干掉他得到的分数,分数和不超过m;y代表干掉他后你能额外干掉多少个,且不计入总分. 求干掉人数最多为多少,以及最小的分. ~~~~~~~~~~~~~~~ ...
- Linux忘记root密码,密码找回,图片展示
忘记root密码 CentOS 7参考地址如下:https://www.baidu.com/s?wd=CentOS7+%E6%89%BE%E5%9B%9Eroot%E5%AF%86%E7%A0%81& ...
- python3.x Day6 paramiko
python3 paramiko模块,用来进行远程操作linux服务器,利用的就是ssh #利用用户名,密码,进行连接 import paramiko #创建一个SSH对象 ssh=paramiko. ...
- Swift - 修改导航栏“返回”按钮文字,图标
Swift - 修改导航栏“返回”按钮文字,图标 2015-11-27 09:13发布:hangge浏览:4037 项目中常常会使用 UINavigationController 对各个页面进行导 ...
- 【转】Comet:基于 HTTP 长连接的“服务器推”技术
原文链接:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无 ...
- PyUV: Python高性能网络库
libUV的python版本 https://github.com/saghul/pyuv
- WebLoad 解析服务器返回的XML格式内容
Parsing the XML Response get the root node: var rootNode = document.wlXmls[0].XMLDocument.documentE ...
- [TyvjP1050] 最长公共子序列(DP)
传送门 f[i][j] 表示第 1 个串匹配到第 i 位,第 2 个串匹配到第 j 位的答案. f[i][j] = max(f[i - 1][j], f[i][j - 1]) (a[i] != ...