蒜头君有 n n n 块积木,编号分别为 1 1 1 到 n n n。
一开始,蒜头把第 i i i 块积木放在位置 i i i。
蒜头君进行 m m m 次操作,每次操作,蒜头把位置 b b b 上的积木整体移动到位置 a a a 上面。
比如 1 1 1 位置的积木是 1 1 1, 2 2 2 位置的积木是 2 2 2,那么把位置 2 2 2 的积木移动到位置 1 1 1 后,位置 1 1 1 上的积木从下到上依次为 1 , 2 1,2 1,2。
输入格式
第一行输入 2 2 2 个整数 n , m ( 1 ≤ n ≤ 10000 , 0 ≤ m ≤ 10000 ) n,m(1 \le n \le 10000, 0 \le m \le 10000) n,m(1≤n≤10000,0≤m≤10000)。
接下来 m m m 行,每行输入 2 2 2 个整数 a , b ( 1 ≤ a , b ≤ n ) a, b(1 \le a, b \le n) a,b(1≤a,b≤n),如果 a a a, b b b 相等则本次不需要移动。
输出格式
输出 n n n 行,第 i i i 行输出位置 i i i 从下到上的积木编号,如果该行没有积木输出一行空行。
样例输入
2 2
1 2
1 2
样例输出
1 2
这行是空的
样例输入
4 4
3 1
4 3
2 4
2 2
样例输出
这行是空的
2 4 3 1
这行也是空的
这行也是空的
解:
这题有个坑,处理方法与上一题类似,但最后一组测试数据刚好有一万个,一般的循环输出会出现内存超限。
附上查找的相关解决方法参考。
NotDeep的(经验贴)那些年在编程题中踩过的坑
zafer的C++ vector容器 循环使用 完成数据清空,回收空间
在循环内有使用容器时,一定要清空。不然前面的测试样例会影响后面的测试数据。
清空方法:clear后swap一下。
swap的使用方法:
aa是向量名
- vector< int >( ).swap(aa);//清空内存
- aa.swap(vector< int >( ));//这种计蒜客的OJ通不过
代码:
#include"iostream"
#include"vector"
using namespace std;
int main()
{
int n,m;//n个元素,m行操作
int a,b;
vector<int> aa[10000];
cin>>n>>m;
for(int i=0;i<n;i++)//赋初值
aa[i].push_back(i+1);
for(int i=0;i<m;i++)
{//下标从0开始,a、b使用时要-1
cin>>a>>b;
if(a==b)continue;//不动
for(int j=0;j<aa[b-1].size();j++)
aa[a-1].push_back(aa[b-1][j]);
aa[b-1].clear();//清空所有元素,包括其开辟地址,使用的话要继续pushback
vector<int>().swap(aa[b-1]);//清空内存
//aa[b-1].swap(vector<int>());//这句通不过
}
for(int i=0;i<n;i++)
{//输出
if(aa[i].size()==0)
{
cout<<endl;
continue;
}
for(int j=0;j<aa[i].size();j++)
{
printf("%d",aa[i][j]);
if(j!=aa[i].size()-1)//控制格式
printf(" ");
}
cout<<endl;
}
return 0;
}