牛客小白月赛29 F-项链

项链

https://ac.nowcoder.com/acm/contest/8564/F

项链

分析

  • 让我们暂且不看区间反转操作,只先考虑移动点的问题。毫无疑问,可以用链表实现。

    图片说明 ,其中 表示位置在编号为i的珠子之后的珠子编号,注意,是编号,图片说明 则表示位置在编号为i的珠子之前的珠子编号。

    假设就是下面的图
    图片说明
    如果我们要移动其中一个点,得先删点
    图片说明
    然后重新加入
    图片说明

    然后考虑翻转操作,因为一旦翻转了,前变后,后变前,那之前编号为i的点的下一个位置的f[1][i]此时就会在他的前面,成为所谓的f[0][i],假设此时要输出,怎么办?倒序啊!这不就是解决的办法吗。如果此时要修改,怎么办?比如说,此时我要把编号为 x 的换到 y 的后面,但我的原序列并没有翻转,
    图片说明
    如果我要把4换到2的后面,此时我只需要在未翻转的序列中把4换到2的前面即可,仅需要倒序输出也可以得到正确答案

    代码

#include<bits/stdc++.h>

using namespace std;

const int N=1e4+10;

int n,m;
int f[2][N],b[N];

inline void print()
{
    int st=0;
    for (int i=0;i<n;i++)
        if(b[i]==1)
        {
            st=i;
            break;
        }

    for (int i=0;i<n;i++)
    {
        printf("%d",b[(st+i)%n]);
        if(i==n-1) puts("");
        else printf(" ");
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    f[1][0]=1;f[0][n+1]=n;
    for (int i=1;i<=n;i++)
        f[0][i]=i-1,f[1][i]=i+1;
    //0:上一个,1:下一个
    int d=0;
    for (int i=1,op;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            int x,y;scanf("%d%d",&x,&y);
            f[d^1][f[d][x]]=f[d^1][x];
            f[d][f[d^1][x]]=f[d][x];//删除 

            f[d][x]=y;
            f[d^1][x]=f[d^1][y];//加点 

            f[d][f[d^1][y]]=x;
            f[d^1][y]=x;//更新
        }
        else if(op==2)
        {
            int x,y;scanf("%d%d",&x,&y);
            f[d^1][f[d][x]]=f[d^1][x];
            f[d][f[d^1][x]]=f[d][x];

            f[d^1][x]=y;
            f[d][x]=f[d][y];
            f[d^1][f[d][y]]=x;
            f[d][y]=x;
        }
        else if(op==3) d^=1;
        else
        {
            if(d==0)
            {
                int st=f[1][0];
                for (int j=1;j<=n;j++)
                {
                    b[j-1]=st;
                    st=f[1][st];
                }print();
            }
            else
            {
                int st=f[0][n+1];
                for (int j=1;j<=n;j++)
                {
                    b[j-1]=st;
                    st=f[0][st];
                }print();
            }
        }
    }

    return 0;
}
比赛题解 文章被收录于专栏

牛客IOI周赛,团队赛,练习赛,挑战赛,各种模拟赛的部分题解

全部评论

相关推荐

会员标识
昨天 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务