双栈排序
标签:max cpp using putchar col bit tor empty cout
题面
二分图染色+模拟
#include
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i = i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout inline bool chkmin(T &a, T b) { return b inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }
inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == ‘-‘) sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
}
void File() {
#ifdef zjp_shadow
freopen ("P1155.in", "r", stdin);
freopen ("P1155.out", "w", stdout);
#endif
}
const int N = 1010, inf = 0x7f7f7f7f;
int n, P[N], minv[N], col[N];
int pos = 1;
stack S[2];
inline void out(char ch) {
putchar (ch); putchar (‘ ‘);
}
inline bool Pop(int id) {
if (!S[id].empty() && S[id].top() == pos) {
out(id ? ‘d‘ : ‘b‘), S[id].pop(), ++ pos;
return true;
}
return false;
}
inline void Push(int cur, int id) {
if (id == 1) { while(Pop(0)); }
while (!S[id].empty() && S[id].top() G[N];
int main () {
File();
n = read();
For (i, 1, n)
P[i] = read();
minv[n + 1] = n + 1;
Fordown (i, n, 1)
minv[i] = min(minv[i + 1], P[i]);
For (i, 1, n) For (j, i + 1, n)
if (minv[j + 1] Q; Q.push(i); col[i] = 0;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int v : G[u]) {
if (~col[v] && col[v] != (col[u] ^ 1)) return puts("0"), 0;
if (!~col[v]) Q.push(v);
col[v] = col[u] ^ 1;
}
}
}
For (i, 1, n)
Push(P[i], col[i]);
bool flag = true;
while (flag) {
flag = false;
while(Pop(0)) flag = true;
while(Pop(1)) flag = true;
}
return 0;
}
双栈排序
标签:max cpp using putchar col bit tor empty cout
原文地址:https://www.cnblogs.com/ainiyuling/p/11581909.html
文章来自:
搜素材网的
编程语言模块,转载请注明文章出处。
文章标题:
双栈排序
文章链接:http://soscw.com/essay/35131.html
评论