vector的亮点用法

https://codeforces.com/contest/1249/problem/B2

div3 Bhard原题

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
int q;//n < 2e5
int n, i;
while(scanf("%d", &q) != EOF){
scanf("%d", &n);
i = 0;
vector<int> p(n);//默认初始化,有n个元素,每个元素都是0
for(int i = 0; i < n; ++i){
cin >> p[i];
--p[i];
}
vector<int> used(n),//*
           ans(n); //*默认初始化有n个元素,每个元素都是0
for(int j = 0; j < n; ++j){
if(!used[j]){
vector<int> cur;
while(!used[j]){
cur.push_back(j);//把孩子放到对应的周期中去
used[j] = 1;
j = p[j];//将书传给下一个小盆友
}
//下面的for循环表示第el个小朋友所在的周期,即天数
for(auto &el : cur)//el是“第el个小朋友”
  ans[el] = cur.size();//cur的元素个数就是周期,即天数
}
}
//如果used[j]已经被赋周期值
for(int j = 0; j < n; ++j)
  cout << ans[j] << " ";
cout <<  endl;
}
}

结论 一个循环内的所有孩子的周期相同,一个循环的周期等于循环中的孩子数

亮点 考虑到结论,我们可以用vector<int>存放每个周期,把某个孩子的编号push_back()进入vector,这样vector的size()就是周期,再设置一个vector<int> v 把周期数都压入其中,v的下标对应孩子的序号,v的对应下标元素对应孩子的周期,最后再依次输出 v 即可。

猜你喜欢

转载自www.cnblogs.com/theSunAndSnow/p/11747500.html
今日推荐