Ankit_132

D

Sep 11th, 2023
488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll     long long
  6. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  7. #define ppb    pop_back
  8. #define pb     push_back
  9.  
  10. int main()
  11. {
  12.     _test
  13.     {
  14.         int n, k;
  15.         cin>>n>>k;
  16.  
  17.         vector<int> a(n);
  18.         for(auto &e: a)
  19.             cin>>e;
  20.  
  21.         if(k == 1)
  22.         {
  23.             int f = 1;
  24.             for(int i=0; i<n; i++)
  25.                 f &= (a[i] == i+1);
  26.  
  27.             if(f)       cout<<"Yes\n";
  28.             else        cout<<"No\n";
  29.  
  30.             continue;
  31.         }
  32.  
  33.         int f = 1;
  34.         for(int i=0; i<n; i++)
  35.             f &= (a[i] != i+1);
  36.  
  37.         if(!f)
  38.         {
  39.             cout<<"No\n";
  40.             continue;
  41.         }
  42.  
  43.         for(auto &e: a)     e--;
  44.  
  45.         vector<vector<int>> graph(n);
  46.         vector<vector<int>> revgraph(n);
  47.  
  48.         for(int i=0; i<n; i++)
  49.         {
  50.             graph[i].pb(a[i]);
  51.             revgraph[a[i]].pb(i);
  52.         }
  53.  
  54.         vector<int> vis(n);
  55.         vector<int> ver;
  56.         vector<int> ok(n);
  57.  
  58.         function<void(int, int)> DFS = [&](int u, int x)
  59.         {
  60.             vis[u] = x;
  61.             ver.pb(u);
  62.  
  63.             for(auto v: graph[u])
  64.             {
  65.                 if(!vis[v])     DFS(v, x+1);
  66.                 else if(vis[v]>0 && x-vis[v]+1==k)
  67.                 {
  68.                     for(int i=ver.size()-1; ;i--)
  69.                     {
  70.                         ok[ver[i]] = 1;
  71.                         if(ver[i] == v)     break;
  72.                     }
  73.                 }
  74.             }
  75.  
  76.             ver.ppb();
  77.             vis[u] = -1;
  78.         };
  79.  
  80.         for(int i=0; i<n; i++)
  81.         {
  82.             if(!vis[i])
  83.                 DFS(i, 1);
  84.         }
  85.  
  86.         function <void(int)> DFS2 = [&](int u)
  87.         {
  88.             for(auto v: revgraph[u])
  89.             {
  90.                 if(!ok[v])
  91.                 {
  92.                     ok[v] = 1;
  93.                     DFS2(v);
  94.                 }
  95.             }
  96.         };
  97.  
  98.         for(int i=0; i<n; i++)
  99.         {
  100.             if(ok[i])
  101.                 DFS2(i);
  102.         }
  103.  
  104.         if(*min_element(ok.begin(), ok.end()) == 0)
  105.             cout<<"No\n";
  106.         else
  107.             cout<<"Yes\n";
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment