2021蓝桥杯 I.双向排序

 

题目:

 

 

解析

(10条消息) 蓝桥杯 I.双向排序_Jozky86的博客-CSDN博客_蓝桥杯双向排序

 

 

代码

static const int N = 100010;
//vector<PII<int, int> >ord;
PII<int, int> ord[N]; //++top模式,0号元素没有值
static int ans[N];
static int n, m, a, b;
void solve() {
        cin >> n >> m;
//      原数组就是1~n
        int top = 0;
//      压缩调整次数 
        while(m--) { //处理order
                cin >> a >> b;
                if (!a) { //order 1
                        if (top && ord[top].first == 0) b = max(ord[top--].second, b);
                        while (top >= 1 && b >= ord[top-1].second) top -= 2;
                        ord[++top] = { 0,b };
                } else if (top) { //保证前面一定有一个order 1,然后才输入order 2
                        if (ord[top].first == 1) b = min(ord[top--].second, b);
                        while (top >= 1 && b <= ord[top - 1].second) top -= 2;
                        ord[++top] = { 1,b };
                }
        }
        int l = 1, r = n, v = n;
        for (int i = 1; i <= top; ++i) { //到top为止,避免访问已被覆盖的元素,当然也可以用vector
                if (ord[i].first == 0)
                        while (r > ord[i].second && r > l)ans[r--] = v--;
                else
                        while (l<ord[i].second && r > l) ans[l++] = v--;
        }
//        对中间进行处理 
        if (top % 2)//最后一次排序为升序 
                while (l <= r)ans[l++] = v--;
        else        //最后一次排序为降序 
                while (l <= r)ans[r--] = v--;
        for (int i = 1; i <= n; ++i)printf("%d ", ans[i]);
}
signed main() {
        solve();

        return 0;
}

 

posted @ 2022-03-15 23:03  dunhedunhe  阅读(301)  评论(0)    收藏  举报