洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配
解题报告:
跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$
然后来康题趴$QwQ$
首先考虑如果只有一个栈的情况?就说如果存在$i<j<k$且$p_k<p_i<p_j$就$GG$了
现在发现有两个栈?就变成划分成两个序列使序列中不存在这个情况?于是显然考虑二分图染色昂$QwQ$如果染色失败说明无解呗.
然后判完无解就考虑输出方案?这个显然就贪心呗.
首先分配栈这个,显然是优先前面的到第一个栈,所以可以在前面判无解的时候一块儿做了,就从前往后扫,能放到第一个栈就放到第一个栈.
然后就输出方案?就按顺序$push$呗,但是因为这里$pop(1)$要优于$push(2)$,所以在每次$push(2)$之前都要先$pop(1)$鸭
然后就没了?$over$
具体康代码趴$QwQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=+;
int n,p[N],mn[N],head[N],ed_cnt,col[N],pos=;
struct ed{int to,nxt;}edge[N*N<<];
stack<int>stck[]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x]};head[x]=ed_cnt;}
il void print(ri x)
{
switch(x)
{
case :{printf("a ");break;}
case :{printf("b ");break;}
case :{printf("c ");break;}
case :{printf("d ");break;}
}
}
il bool pop(ri opt)
{
if(!stck[opt].empty() && stck[opt].top()==pos)return print((opt+)<<),stck[opt].pop(),++pos,;
return ;
}
il void push(ri x,ri opt)
{
if(opt)while(pop());//printf("x=%d opt=%d\n",x,opt);
while(!stck[opt].empty() && stck[opt].top()<x)if(!pop(opt))pop(!opt);
if(opt)while(pop());stck[opt].push(x);print(opt<<|);
} int main()
{
n=read();rp(i,,n)p[i]=read();mn[n+]=n;my(i,n,)mn[i]=min(mn[i+],p[i]);rp(i,,n)rp(j,i+,n)if(mn[j+]<p[i] && p[i]<p[j])ad(i,j),col[i]=col[j]=-;
rp(i,,n)
if(!(~col[i]))
{
queue<int>Q;Q.push(i);col[i]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();
e(i,nw){if(col[t(i)]==col[nw])return printf("0\n"),;if(!(~col[t(i)]))Q.push(t(i)),col[t(i)]=!col[nw];}
}
}
rp(i,,n)push(p[i],col[i]);rb flg=;while(flg){flg=;while(pop())flg=;while(pop())flg=;}
return ;
}
洛谷$P1155$ 双栈排序 贪心+二分图匹配的更多相关文章
- vijos 1605 双栈排序 - 贪心 - 二分图
题目传送门 传送门I 传送门II 题目大意 双栈排序,问最小字典序操作序列. 不能发现两个数$a_{j}, a_{k}\ \ (j < k)$不能放在同一个栈的充分必要条件时存在一个$i$使得$ ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- [NOIP2008]双栈排序 【二分图 + 模拟】
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- Luogu1155 NOIP2008 双栈排序 【二分图染色】【模拟】
Luogu1155 NOIP2008 双栈排序 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过 2个栈 S1 和 S2 ,Tom希望借助以下 44 种操作实现将输入序列升序排序. 操作 ...
- [LuoguP1155]双栈排序_二分图_bfs
双栈排序 题目链接:https://www.luogu.org/problem/P1155 数据范围:略. 题解: 神仙题. 就第一步就够劝退了. 这个二分图非常不容易,首先只有两个栈,不是属于一个就 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
随机推荐
- HZOJ Weed
作者的题解: 如果一段操作被执行,会对整个栈有什么影响呢? 把栈弹出若干个数后再插入若干个数. 线段树: 每个点纪录三个值:执行完这段操作后会删多少个,再插多少个,插的和一共是多少. 合并值时再用一个 ...
- Javascript 严格模式下不允许删除一个不允许删除的属性
如下代码,在严格模式下,如果删除 Object.prototype 浏览器会报错,目前 IE10 也支持 严格模式. <script> "use strict"; de ...
- Libev源码分析02:Libev中的IO监视器
一:代码流程 在Libev中,启动一个IO监视器,等待该监视器上的事件触发,然后调用该监视器的回调函数.整个的流程是这样的: 首先调用ev_default_loop初始化struct ev_loop ...
- Libev源码分析09:select突破处理描述符个数的限制
众所周知,Linux下的多路复用函数select采用描述符集表示处理的描述符.描述符集的大小就是它所能处理的最大描述符限制.通常情况下该值为1024,等同于每个进程所能打开的描述符个数. 增大描述符集 ...
- mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记
mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...
- phpstorm 里能做git的命令行操作吗?
在VCS菜单下面有 GIT -> Branches 然后会弹出branch菜单,后面怎么操作应该不需要解释吧,所有的branch都列出来自己选 在Tools菜单下面有Open Terminal. ...
- c++ 基本使用
1 枚举 enum ShapeType { circle, square, rectangle }; int main() { ShapeType shape = circle; switch(sha ...
- H3C ACL包过滤显示与调试
- centos7的gnome假死
centos7的gnome假死,干掉gnome相关进程,如nautilus,kworker
- H3C 多路径网络中环路产生过程(3)