您当前的位置: 首页 > 

HeartFireY

暂无认证

  • 5浏览

    0关注

    334博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[GYM101173F] CERC 16 F.Free Figurines 并查集思想,转化

HeartFireY 发布时间:2021-10-26 20:58:44 ,浏览量:5

传送门

题目大意:(套娃)按照大小包含顺序从 1 − N 1-N 1−N编号,编号大的套娃可以套住编号小的套娃,如下图所示,套娃层层套住,最内层的套娃下标最小。

在这里插入图片描述

容易看出,要想取出内层的套娃,需要层层拆开。支持两个操作:

  • 当前套娃内部空,放入一个套娃;
  • 当前套娃内部非空,取出一个套娃。

现在给定初始状态和最终状态下每个套娃外层的套娃的编号,要求你求出从初始状态变动到末状态所需要执行的最少操作数。(套娃的父亲编号为0时,套娃独立存在)

思路分析:首先我们统计初始状态下将套娃全部拆散再组合成末状态所需要的操作数,此操作数为最大的操作数。然后在最大操作数的基础上消除不必要的操作。考虑如何消除:

  1. 首先找到每堆套娃的最内部的套娃编号;
  2. 容易知道,对于内部一样的套娃,可以直接整体取出。因此每出现一个与末状态相同的套娃,就可以节省两步操作(取出和放回);
  3. 我们从每个最内部的套娃沿给定的 F a Fa Fa数组不断向外层跳,每次判断是否与末状态相同,如果相同,则在总操作中减去两部操作。
#include 
using namespace std;

const int N = 1e5 + 10;
int a[N], b[N], st[N];

signed main(){
    int n = 0, tot = 0, det = 0; cin >> n;
    for(int i = 1; i > a[i];
        if(a[i]) tot += 1, st[a[i]] = 1;
    }
    for(int i = 1; i > b[i];
        if(b[i]) tot += 1, st[b[i]] = 1;
    }
    for(int i = 1; i             
关注
打赏
1662600635
查看更多评论
0.0506s