专栏文章

题解:AT_abc395_d [ABC395D] Pigeon Swap

AT_abc395_d题解参与者 8已保存评论 7

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
7 条
当前快照
1 份
快照标识符
@miq3dfee
此快照首次捕获于
2025/12/03 22:17
3 个月前
此快照最后确认于
2025/12/03 22:17
3 个月前
查看原文
fyy 是一个珂愛的女孩子,有一天她购得 NN 只珂愛的 da_ke。
她初始将编号 ii 的 da_ke 放置在 ii 号笼子里。
随后,她进行 QQ 次操作,操作分为 22
  1. aa 号 da_ke 放入 bb 号笼子
  2. aa 号笼子和 bb 号笼子里的所有 da_ke 互换。
fyy 可以在任意时刻问妳某个 da_ke 在哪个笼子里。
fyy 非常喜欢 da_ke,于是她买了很多只,于是妳要使用一种非常高效的算法来回答她的问题。
「珂愛的我」(下简记为我)想到,对于操作 11 是容易的,经常刷题的朋友都知道,对于操作 22 不容易单个处理,必须整体处理
对于操作 22,我想到将笼子 aa 和笼子 bb 整体交换。但这将导致 aabb 的位置改变,da_ke 的位置也将改变,如何处理呢?
问题过于抽象,为了更加形象(笔者赛时也是这么想的),我将问题形象化。
将笼子和 da_ke 一起放在数轴上。为了语言描述,我常用「da_ke 本身」和「笼子本身」这两个短语。
  • 对于所有操作 11,我们只需挪动 da_ke 本身的位置即可。
  • 对于所有操作 22
    • 保证 da_ke 本身的位置不变(解题的关键)。
    • 只交换笼子本身达到效果。
    • 更新笼子本身的位置。
以上是一些感性认识,我们现在将其转换为形式化语言。
记笼子 ii 的坐标位置为 SiS_i,坐标位置 ii 的笼子为 EiE_i,编号为 ii 的 da_ke 目前被关在坐标位置为 HiH_i 的笼子里。
  • 对于操作 11HaSbH_a \leftarrow S_b
  • 对于操作 22
    • aa 的位置将被 bb 占用,bb 同理,于是有 ESab,ESbaE_{S_a}\leftarrow b,E_{S_b}\leftarrow a
    • a,ba,b 的坐标位置互换,达到 Sa=Sb,Sb=SaS_a'=S_b,S_b'=S_a 的效果。
代码是简单的。
CPP
int main()
{
    int N,Q;
    cin>>N>>Q;
    vector<int> st(N+1),ed(N+1),home(N+1); // st 为某个巢的坐标位置,ed 为某个坐标位置的巢。 
    rep(i,1,N) st[i]=i,ed[i]=i,home[i]=i;
    rep(i,1,Q)
    {
        int o;
        cin>>o;
        // 操作时应保证,鸽子是不动的。
        if(o==1)
        {
            int a,b;
            cin>>a>>b;
            home[a]=st[b];
        }
        /*
        .....a.....b....
        .....b.....a....
        */
        if(o==2)
        {
            int a,b;
            cin>>a>>b;
            ed[st[a]]=b,ed[st[b]]=a;
            swap(st[a],st[b]);
        }
        if(o==3)
        {
            int a;
            cin>>a;
            cout<<ed[home[a]]<<endl;
        }
    }
}

// 路虽远行则将至,事虽难做则必成。

评论

7 条评论,欢迎与作者交流。

正在加载评论...