NOIP2008提高组 双栈排序

链接

双栈排序

题解

非常巧妙地将问题转化成二分图判断。
i , j i, j i,j能够被压入同一个栈中的条件是不存在满足如下条件的元素 k k k
a [ k ] &lt; a [ i ] &lt; a [ j ] ,   i &lt; j &lt; k a[k] &lt; a[i] &lt; a[j], i &lt; j &lt; k a[k]<a[i]<a[j] i<j<k
因为当把 j j j压入栈中时要先将 i i i弹栈,而把 i i i弹栈之前必定已经将 k k k弹栈,这和 i , j , k i,j,k ijk的顺序是矛盾的。
将不能放入同一个栈中的元素两两连边,之后二分图判定,解决可行性之后贪心解决字典序问题即可

代码

#include <bits/stdc++.h>

using namespace std;

#define REP(i, n) for (int i = 1; i <= (n); i++)
#define sqr(x) ((x) * (x))

const int maxn = 1000 + 50;
const int maxm = 1000000 + 50;
const int maxt = 500 + 5;

typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;

const LL unit = 1LL;
const int INF = 0x3f3f3f3f;
const LL Inf = 0x3f3f3f3f3f3f3f3fLL;
const double eps = 1e-8;
const double inf = 1e15;
const double pi = acos(-1.0);
const LL mod = 1000000007;

struct Edge
{
    int from, to, next;
    Edge(int from = 0, int to = 0, int next = 0) : from(from), to(to), next(next) {}
} edge[maxm];

int n;
int a[maxn], dp[maxn];
int head[maxn], tot;
int color[maxn];
vector<char> ans;

void init()
{
    memset(head, -1, sizeof(head));
    memset(color, 0, sizeof(color));
    tot = 0;
}

void AddEdge(int u, int v)
{
    edge[tot] = Edge(u, v, head[u]);
    head[u] = tot++;
}

bool dfs(int u, int fa, int tag)
{
    color[u] = tag;
    for (int i = head[u]; i != -1; i = edge[i].next)
    {
        int v = edge[i].to;
        if (v == fa || color[v] == -color[u])
            continue;
        if (color[v] == color[u] || !dfs(v, u, -tag))
            return false;
    }
    return true;
}

stack<int> sta[2];

int main()
{
    ios::sync_with_stdio(false);
    freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
    int T;
    cin >> T;
    while (T--)
    {
        init();
        ans.clear();
        while (!sta[0].empty())
            sta[0].pop();
        while (!sta[1].empty())
            sta[1].pop();
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];

        dp[n] = a[n];
        for (int i = n - 1; i >= 1; i--)
            dp[i] = min(dp[i + 1], a[i]);

        for (int i = 1; i <= n; i++)
            for (int j = i + 1; j <= n; j++)
                if (a[i] < a[j])
                {
                    int t = dp[j];
                    if (t < a[i])
                    {
                        AddEdge(i, j);
                        AddEdge(j, i);
                    }
                }

        bool ok = true;
        for (int i = 1; i <= n; i++)
        {
            if (!color[i] && !dfs(i, -1, 1))
                ok = false;
        }

        if (!ok)
        {
            cout << 0 << endl;
            continue;
        }

        int flag = 1;
        for (int i = 1; i <= n; i++)
        {
            if (color[i] == 1)
            {
                ans.push_back('a');
                sta[0].push(a[i]);
            }
            else
            {
                ans.push_back('c');
                sta[1].push(a[i]);
            }

            while ((!sta[0].empty() && sta[0].top() == flag) || (!sta[1].empty() && sta[1].top() == flag))
            {
                if (!sta[0].empty() && sta[0].top() == flag)
                {
                    ans.push_back('b');
                    sta[0].pop();
                }
                else
                {
                    ans.push_back('d');
                    sta[1].pop();
                }
                flag++;
            }
        }
        cout << ans[0];
        for (int i = 1; i < ans.size(); i++)
        {
            cout << " " << ans[i];
        }
        cout << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值