Advertisement
The5threic1-1

TLE-T-16 (BinCoin)

Feb 7th, 2024
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | Source Code | 0 0
  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. using namespace std;
  4. #ifdef  ONLINE_JUDGE
  5.     #define eprintf(...) 42
  6. #else
  7.         #define eprintf(...) {fprintf(stderr, __VA_ARGS__);fflush(stderr);}
  8. #endif
  9. clock_t startTime;
  10. double getCurrentTime()
  11. {
  12.     return (double)(clock() - startTime) / CLOCKS_PER_SEC;
  13. }
  14. mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
  15. int solve()
  16. {
  17.     int n, k;
  18.     cin>>n>>k;
  19.     int arr[k][n], pos[k][n+1], l[k][n+1], r[k][n+1], cpy[k][n];
  20.     int parent[n+1] = { 0 };
  21.     for(int i=0; i<k; i++)
  22.     {
  23.         for(int j=0; j<n; j++)
  24.         {
  25.             cin>>arr[i][j];
  26.             cpy[i][j] = arr[i][j];
  27.             pos[i][arr[i][j]] = j; l[i][arr[i][j]] = j; r[i][arr[i][j]] = j;
  28.         }      
  29.     }
  30.     uniform_int_distribution<int> rnd(1,n);
  31.     set<int> skippie;
  32.     int shuff[n+1];
  33.     for(int i=1; i<=n; i++)
  34.     {
  35.         shuff[i] = i;
  36.     }
  37.     while((int)skippie.size()<n)
  38.     {
  39.         skippie.clear();
  40.         for(int p=0; p<n; p++)
  41.         {
  42.             for(int i=1; i<=n; i++)
  43.             {
  44.                 int swappie = rnd(gen);
  45.                 swap(shuff[i], shuff[swappie]);
  46.             }
  47.             for(int m=1; m<=n; m++)
  48.             {
  49.                 int i = shuff[m];
  50.                 if(skippie.count(i))
  51.                 {
  52.                     continue;
  53.                 }
  54.                 bool vrai = true;
  55.                 set<int> neigh;
  56.                 for(int j=0; (j<k) && vrai; j++)
  57.                 {
  58.                     if(pos[j][i]==0 || pos[j][i]==n-1)
  59.                     {
  60.                         vrai = false;
  61.                         continue;
  62.                     }      
  63.                     if(neigh.empty())
  64.                     {
  65.                         neigh.insert(arr[j][pos[j][i]-1]); neigh.insert(arr[j][pos[j][i]+1]);
  66.                     }
  67.                     else
  68.                     {
  69.                         if((!neigh.count(arr[j][pos[j][i]-1]))||(!neigh.count(arr[j][pos[j][i]+1])))
  70.                         {
  71.                             vrai = false;
  72.                         }
  73.                     }              
  74.                 }
  75.                 if(vrai)
  76.                 {
  77.                     for(auto child : neigh)
  78.                     {
  79.                         skippie.insert(child);
  80.                         parent[child] = i; 
  81.                     }          
  82.                     skippie.insert(i);
  83.                     for(int f=0; f<k; f++)
  84.                     {
  85.                         for(auto child : neigh)
  86.                         {  
  87.                             l[f][i] = min(l[f][i], l[f][child]);
  88.                             r[f][i] = max(r[f][i], r[f][child]);
  89.                         }
  90.                         arr[f][l[f][i]] = i; arr[f][r[f][i]] = i;
  91.                     }
  92.                 }
  93.             }
  94.         }
  95.         for(int i=0; i<k; i++)
  96.         {
  97.             for(int j=0; j<n; j++)
  98.             {
  99.                 arr[i][j] = cpy[i][j];
  100.                 pos[i][arr[i][j]] = j; l[i][arr[i][j]] = j; r[i][arr[i][j]] = j;
  101.             }      
  102.         }
  103.     }
  104.     for(int i=1; i<=n; i++)
  105.     {
  106.         cout<<(parent[i]==0 ? -1 : parent[i])<<" ";
  107.     }
  108.     cout<<endl;
  109.     return 0;
  110. }
  111. int main()
  112. {
  113.     ios::sync_with_stdio(false);
  114.     cin.tie(0);
  115.     int t=1;
  116.     //cin>>t;
  117.     startTime = clock();
  118.     while(t--)
  119.     {
  120.         startTime = clock();
  121.         solve();
  122.     }
  123.     eprintf("time = %.5lf\n", getCurrentTime());
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement