Submission #1300549

#TimeUsernameProblemLanguageResultExecution timeMemory
1300549loomBrought Down the Grading Server? (CEOI23_balance)C++20
10 / 100
2097 ms86220 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf (int)2e18
#define nl '\n'

const int N = 1e5+1;
vector<array<int,3>> ep;
vector<int> ans[N];
int tk[5*N], vis[8*N];
int n;
 
void dfs(int v, vector<vector<pair<int,int>>>& g){
   for(auto &[ch, ix] : g[v]){
      if(vis[ix]) continue;

      vis[ix] = 1;
      dfs(ch, g);
      ep.push_back({v, ch, ix});
   }
}

void solve(int l, int r, vector<vector<pair<int,int>>>& g){
   if(l == r){
      for(int i = 1; i <= n; i++){
         auto &[ch, ix] = g[i][0];
         ans[i].push_back(tk[ix]);     
      }

      return;
   }

   for(int i = 1; i <= 3*n; i++){
      if(g[i].size() % 2){
         g[0].push_back({i, 5*n + i});
         g[i].push_back({0, 5*n + i});
      }
   }

   ep.clear();
   for(int i = 0; i <= 8*n; i++) vis[i] = 0;

   for(int i = 0; i <= 3*n; i++){
      dfs(i, g);
   }

   vector<vector<pair<int,int>>> lg(3*n + 5), rg(3*n + 5);

   for(int i = 0; i < ep.size(); i++){
      auto &[x, y, ix] = ep[i];
      if(x == 0 or y == 0) continue;

      if(i % 2){
         lg[x].push_back({y, ix});
         lg[y].push_back({x, ix});
      }
      else{
         rg[x].push_back({y, ix});
         rg[y].push_back({x, ix});
      }
   }

   int m = (l+r)/2;
   solve(l, m, lg);
   solve(m+1, r, rg);
}

void solve(){
   int s, m;
   cin>>n>>s>>m;

   vector<vector<pair<int,int>>> g(n+m+5);

   for(int i = 1; i <= n; i++){
      for(int j = 0; j < s; j++){
         int t;
         cin>>t;

         int ix = (i-1)*s + j;
         g[n+t].push_back({i, ix});
         tk[ix] = t;
      }
   }

   set<pair<int,int>> st;
   for(int i = 1; i <= m; i++){
      st.insert({g[n+i].size(), n+i});
   }

   while(st.size() >= 2){
      auto [sx, x] = *st.begin();
      st.erase(st.begin());
      auto [sy, y] = *st.begin();
      st.erase(st.begin());
      
      if(sx + sy > s) break;

      for(auto &[ch, ix] : g[x]) g[y].push_back({ch, ix});
      g[x].clear();
      st.insert({sx + sy, y});
   }

   for(int i = n+1, cnt = n; i <= n+m; i++){
      if(g[i].empty()) continue;
      cnt++;
      swap(g[cnt], g[i]);

      for(auto &[ch, ix] : g[cnt]){
         g[ch].push_back({cnt, ix});
      }
   }

   g.resize(3*n + 5);
   solve(1, s, g);

   for(int i = 1; i <= n; i++){
      for(int x : ans[i]) cout<<x<<" ";
      cout<<nl;
   }
}

signed main(){
   ios_base::sync_with_stdio(0);
   cin.tie(NULL);cout.tie(NULL);

   int t = 1;
   //cin>>t;
   while(t--) solve();

   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...