B题求解

B题我没有用拓扑排序,就是正常的模拟思维,然后开一个数组mp[]记录一下每个点能走的最远距离,

然后一个for扫描一遍数组,for里面套一个while循环,并且在for里面开一个map<int,int> v来记录

一下v[i]有没有被走过。然后就是如果a[j]!=j并且v[j]==0,而且flag>=mp[j]就是flag>=最优解,

就说明可以从j跳到a[j],在while循环要更新falg并且v[j]=1标记为已经走过,退出whil循环后就更新sum

并且for循环继续往下走,但是能过92.59%的数据,我严重怀疑是后来加的数据导致我过不去QWQ

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int M = 1e5 + 10;

int a[M];

int n;

int mp[M];

signed main() {

cin >> n;

for (int i = 1; i <= n; i++)

cin >> a[i];

int sum = 0;

for (int i = 1; i <= n; i++) {

int j = i;

int flag = 0;

map<int, int> v;

while (mp[j] <= flag && v[j] == 0) {

if (a[j] == j) {

flag++;

mp[j] = flag;

break;

}

v[j] = 1;

flag ++;

mp[j] = flag;

j = a[j];

}

sum = max(sum, flag);

}

cout << sum;

return 0;

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务