码迷,mamicode.com
首页 > 其他好文 > 详细

C. Report

时间:2018-08-07 00:39:01      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:完成   分享   分享图片   ++   print   code   +=   epo   info   

题意:给出n个无序的数以及m个操作,每个操作由两个数组成,第一个数是操作的方式,第二个数 i 是操作的范围,若第一个数是1,则给 1-i 个数按升序排序,若第二个数是2,则给 1-i 个数按降序排列。输出所有操作完成后的序列。

 

技术分享图片

技术分享图片

技术分享图片

 

 

int n, m;
arr a, ans;
int top = 0;
int tot = 0;
struct node
{
    int r, tp, id;
} p[N], q[N];
bool cmp(node a, node b)
{
    if (a.r == b.r)
        return a.id > b.id;
    return a.r > b.r;
}

int main()
{
    // file("test");
    sdf(n), sdf(m);
    For(i, 1, n) sdf(a[i]);
    For(i, 1, m)
    {
        int x, y;
        sdf(x), sdf(y);
        p[i] = (node){y, x, i};
    }
    sort(p + 1, p + 1 + m, cmp);
    int st = 1;
    For(i, 1, m)
    {
        if (p[i].id < st)
            continue;
        st = p[i].id;
        if (i >= 2 && p[i].tp == q[tot].tp)
            continue;
        q[++tot] = p[i];
        if (p[i].id == m)
            break;
    }
    top = n+1;
    FFor(i, n, q[1].r + 1)
        ans[--top] = a[i];
    sort(a + 1, a + 1 + q[1].r);
    int L = 1, R = q[1].r;

    For(i, 1, tot)
    {
        int dt = q[i].r - q[i + 1].r;
        if (q[i].tp == 1)
        {
            FFor(j, R, R-dt+1)
                ans[--top] = a[j];
            R -= dt;
        }
        else
        {
            For(j, L, L + dt - 1)
                ans[--top] = a[j];
            L += dt;
        }
    }
    For(i,1,n)
        printf("%d ", ans[i]);

    return 0;
}

 

C. Report

标签:完成   分享   分享图片   ++   print   code   +=   epo   info   

原文地址:https://www.cnblogs.com/planche/p/9434231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!