NOIp2018提高组 双栈排序
这真是道神奇的题目:
原题链接
首先我们要证明以下的性质:
若原序列为\(\{a_n\}\),\(a_i\)和\(a_j\)不能同时放入一个栈中,当且仅当\(i<j,a_i<a_j\),且存在\(k\),\(s.t. \ k>j\)的同时有\(a_k<a_i\)。
原因很显然,因为有比\(a_i\)还小的元素在后面,若放入同一个栈中,必须先压栈压到\(a_k\),再弹出,但又因为会先弹出\(a_j\),序列的单调性就被破坏了。
所以对于每一对\(a_i\)和\(a_j\),我们都可以用上述性质来判断它们是否能在同一个栈中,再用后缀最大值优化一下,复杂度\(O(n^2)\)。
然后我们就有了这样的一些关系,我们该如何利用这些关系来判断序列是否合法呢?
二分图染色,对于不能在同一个栈中的两个位置,我们连一条无向边,然后dfs判断所有点能否二染色。如果能,序列就是合法的,否则不合法。
对于染色后的图,其实我们已经知道操作顺序了,又因为题目要求字典序最小,所以我们只用模拟一下,优先在栈\(S1\)上操作就行了。
上代码:
#include <bits/stdc++.h>
using namespace std;
#define wrap cout << endl
const int N = 1000;
int n, a[N+5], color[N+5], f[N+5], flag;
vector<int> G[N+5];
void addEdge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
}
void dfs(int u) {
for(int i = 0; i < G[u].size(); ++i) {
int v = G[u][i];
if(color[v]) {
if(color[v] == color[u])
flag = 1;
}
else {
color[v] = 3-color[u];
dfs(v);
}
}
}
void solve() {
int cur = 1;
stack<int> s1, s2;
for(int i = 1; i <= n; ++i) { //模拟
if(color[i] == 1) s1.push(a[i]), cout << 'a' << " ";
if(color[i] == 2) s2.push(a[i]), cout << 'c' << " ";
while((!s1.empty() && s1.top() == cur) || (!s2.empty() && s2.top() == cur)) {
if(!s1.empty() && s1.top() == cur) s1.pop(), cout << 'b' << " ";
if(!s2.empty() && s2.top() == cur) s2.pop(), cout << 'd' << " ";
++cur;
}
}
}
int main() {
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
f[n+1] = 0x3f3f3f3f;
for(int i = n; i >= 1; --i) f[i] = min(f[i+1], a[i]);
for(int i = 1; i <= n; ++i)
for(int j = i+1; j <= n; ++j)
if(a[i] < a[j] && f[j+1] < a[i]) addEdge(i, j); //判断是否加边
for(int i = 1; i <= n; ++i)
if(!color[i])
color[i] = 1, dfs(i);
if(flag) {
cout << "0" << endl;
return 0;
}
solve();
return 0;
}
NOIp2018提高组 双栈排序的更多相关文章
- 双栈排序 2008年NOIP全国联赛提高组(二分图染色)
双栈排序 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description Tom最近在研究一个有 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)
[题目描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
- 双栈排序(codevs 1170)题解
[问题描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...
- [NOIp2018提高组]赛道修建
[NOIp2018提高组]赛道修建 题目大意: 给你一棵\(n(n\le5\times10^4)\)个结点的树,从中找出\(m\)个没有公共边的路径,使得第\(m\)长的路径最长.问第\(m\)长的路 ...
- [NOIp2018提高组]货币系统
[NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...
- NOIP2018提高组省一冲奖班模测训练(四)
NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...
- NOIP2018提高组省一冲奖班模测训练(三)
NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...
随机推荐
- 注册Github过程
第一步当然是建立自己的账号密码了: 一: github官网地址:https://github.com/ (1)第一步:首先起一个属于自己用户的名字(username),用户名字只能包含字母数字的字符或 ...
- ext图片预览功能实现,前端代码
效果图: extjs代码: // 模型 Ext.define('ParkingAttachment', {extend: "Ext.data.Model", idProperty: ...
- MongoDB副本集功能及节点属性梳理
副本集的主要功能 副本集是MongoDB高可用的基础,其主要作用 归纳为以下几点: (1)高可用,防止设备(服务器.网络)故障.提供自动FailOver功能. (2)无需配置高可用性虚拟节点:无论是S ...
- 【原】Java学习笔记007 - 流程控制
package cn.temptation; public class Sample01 { public static void main(String[] args) { // for循环 // ...
- pycharm导入自定义py文件出错
1. 被导入的py文件不能以数字开头,否则会报错,红色波浪线
- Asp.Net Core 下 Newtonsoft.Json 转换字符串 null 替换成string.Empty
public class NullToEmptyStringResolver : DefaultContractResolver { /// <summary> /// 创建属性 /// ...
- 什么是POE交换机?
POE交换机和普通交换机的区别有: 1.POE交换机不但可以实现普通交换机的数据传输功能还能同时对网络终端进行供电 .普通的交换机主要是交换数据的功能,并没有具备供电的功能. 2.现在的网络高清摄像机 ...
- SQLServer数据库差异备份
差异备份 (differential backup)定义 一种数据备份,基于完整数据库或部分数据库或一组数据文件或文件组(差异基准)的最新完整备份,并且仅包含自确定差异基准以来发生更改的数据. 使用S ...
- LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
- C. Songs Compression(简单贪心)
水题 #include<iostream> #include<algorithm> using namespace std; #define LL long long ; st ...