Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define _test int _TEST; cin>>_TEST; while(_TEST--)
- #define ppb pop_back
- #define pb push_back
- int main()
- {
- _test
- {
- int n, k;
- cin>>n>>k;
- vector<int> a(n);
- for(auto &e: a)
- cin>>e;
- if(k == 1)
- {
- int f = 1;
- for(int i=0; i<n; i++)
- f &= (a[i] == i+1);
- if(f) cout<<"Yes\n";
- else cout<<"No\n";
- continue;
- }
- int f = 1;
- for(int i=0; i<n; i++)
- f &= (a[i] != i+1);
- if(!f)
- {
- cout<<"No\n";
- continue;
- }
- for(auto &e: a) e--;
- vector<vector<int>> graph(n);
- vector<vector<int>> revgraph(n);
- for(int i=0; i<n; i++)
- {
- graph[i].pb(a[i]);
- revgraph[a[i]].pb(i);
- }
- vector<int> vis(n);
- vector<int> ver;
- vector<int> ok(n);
- function<void(int, int)> DFS = [&](int u, int x)
- {
- vis[u] = x;
- ver.pb(u);
- for(auto v: graph[u])
- {
- if(!vis[v]) DFS(v, x+1);
- else if(vis[v]>0 && x-vis[v]+1==k)
- {
- for(int i=ver.size()-1; ;i--)
- {
- ok[ver[i]] = 1;
- if(ver[i] == v) break;
- }
- }
- }
- ver.ppb();
- vis[u] = -1;
- };
- for(int i=0; i<n; i++)
- {
- if(!vis[i])
- DFS(i, 1);
- }
- function <void(int)> DFS2 = [&](int u)
- {
- for(auto v: revgraph[u])
- {
- if(!ok[v])
- {
- ok[v] = 1;
- DFS2(v);
- }
- }
- };
- for(int i=0; i<n; i++)
- {
- if(ok[i])
- DFS2(i);
- }
- if(*min_element(ok.begin(), ok.end()) == 0)
- cout<<"No\n";
- else
- cout<<"Yes\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment