军训日记:查寝

小军的军训进行到了一半了,今天军训教官搞了一波突然袭击,进行了一个寝的查。

提前了解到查寝消息的小军准备进行一波整理归纳,来使自己的寝室变得更加整洁。具体来说,小军有n件物品,放在n个盒子里,第i个盒子有物品i,小军会进行m次整理,第i次整理,小军会依次在第x个盒子顶拿走物品放入第y个盒子内,直至第x个盒子完全搬空。比如第1个盒子自顶向下有物品1、2,第2个盒子有物品3,将盒子1内的物品搬入盒子2内后结果是: 第1个盒子没有物品,第2个盒子自顶向下是2、1、3

现在,小军告诉你n还有m次操作具体是什么,你能告诉他最后每个盒子内有几个物品,他们具体是什么么?

输入:

一个正整数n代表盒子和物品数,一个正整数m代表整理归纳的次数

接下来m行输入,一行两个正整数x y,代表用上述的方法将盒子x的物品搬到盒子y里

1n≤10^5, 1≤m≤10^6, 1≤x,y≤n

题目保证x != y

输出;

有n行输出

第i行,先输出一个正整数k,表示第i个盒子内的物品数,接下来输出n个数,表示第i个盒子自顶向下的物品标号

注意:

行末无空格,文末有回车。

这题竟然真的可以用c++ STL做,splice好快

#include<bits/stdc++.h>
using namespace std;
list<long> box[100005],rebox[100005];
main()
{
    long i,n,m,x,y;scanf("%ld%ld",&n,&m);
    for(i=1;i<=n;i++)
    {
        box[i].push_back(i);rebox[i].push_back(i);
    }   
    while(m--)
    {
        scanf("%ld%ld",&x,&y);
        if(!box[x].empty())
        {
            box[y].splice(box[y].end(),rebox[x]);
            rebox[y].splice(rebox[y].begin(),box[x]);
            box[x].clear();rebox[x].clear();
        }     
    }
    for(i=1;i<=n;i++)
    {
        printf("%zu",box[i].size());
        if(!box[i].empty())
        for(auto j:rebox[i])
        printf(" %ld",j);printf("\n");
    }
    system("pause");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值