Advertisement
leanchec

poder.cpp

Aug 18th, 2024
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. vector<vector<pair<int,int>>> pai;
  6. vector<vector<int>> resp;
  7.  
  8. vector<vector<priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>>>> vis, nome;
  9.  
  10. pair<int,int> achar(pair<int,int> i){
  11.     if(pai[i.first][i.second]==i)return i;
  12.     return pai[i.first][i.second]=achar(pai[i.first][i.second]);
  13. }
  14.  
  15. void juntar(pair<int,int> a, pair<int,int> b){
  16.     a=achar(a);
  17.     b=achar(b);
  18.  
  19.     if(a==b)return;
  20.  
  21.     if(nome[a.first][a.second].size()<nome[b.first][b.second].size())swap(a, b);
  22.     resp[a.first][a.second]+=resp[b.first][b.second];
  23.     pai[b.first][b.second]=a;
  24.     while(vis[b.first][b.second].size()){
  25.         vis[a.first][a.second].push(vis[b.first][b.second].top());
  26.         vis[b.first][b.second].pop();
  27.     }
  28.     while(nome[b.first][b.second].size()){
  29.         nome[a.first][a.second].push(nome[b.first][b.second].top());
  30.         nome[b.first][b.second].pop();
  31.     }
  32. }
  33.  
  34. int32_t main(){
  35.     ios_base::sync_with_stdio(0); cin.tie(0);
  36.     int n, m;
  37.     cin >> n >> m;
  38.     vector<vector<int>> mapa(n+3), sol(n+3);
  39.     vis.resize(n+3);
  40.     nome.resize(n+3);
  41.     pai.resize(n+3);
  42.     resp.resize(n+3);
  43.     for(int i=0; i<n; i++){
  44.         mapa[i].resize(m+3);
  45.         sol[i].resize(m+3);
  46.         vis[i].resize(m+3);
  47.         nome[i].resize(m+3);
  48.         pai[i].resize(m+3);
  49.         resp[i].resize(m+3);
  50.     }
  51.  
  52.     for(int i=0; i<n; i++){
  53.         for(int j=0; j<m; j++){
  54.             cin >> mapa[i][j];
  55.         }
  56.     }
  57.  
  58.     priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>> ordem;
  59.  
  60.     for(int i=0; i<n; i++){
  61.         for(int j=0; j<m; j++){
  62.             ordem.push({mapa[i][j], {i, j}});
  63.             if(i>0)vis[i][j].push({mapa[i-1][j], {i-1, j}});
  64.             if(i+1<n)vis[i][j].push({mapa[i+1][j], {i+1, j}});
  65.             if(j>0)vis[i][j].push({mapa[i][j-1], {i, j-1}});
  66.             if(j+1<m)vis[i][j].push({mapa[i][j+1], {i, j+1}});
  67.             nome[i][j].push({-1, {i, j}});
  68.             pai[i][j]=make_pair(i, j);
  69.             resp[i][j]=mapa[i][j];
  70.         }
  71.     }
  72.  
  73.     while(ordem.size()){
  74.         pair<int,int> cur=ordem.top().second;
  75.         if(cur!=achar(cur) || resp[cur.first][cur.second]!=ordem.top().first){
  76.             ordem.pop();
  77.             continue;
  78.         }
  79.         ordem.pop();
  80.         if(vis[cur.first][cur.second].empty() || resp[cur.first][cur.second]<vis[cur.first][cur.second].top().first){
  81.             while(nome[cur.first][cur.second].top().first==-1){
  82.                 pair<int,int> atual=nome[cur.first][cur.second].top().second;
  83.                 nome[cur.first][cur.second].pop();
  84.                 sol[atual.first][atual.second]=resp[cur.first][cur.second];
  85.                 nome[cur.first][cur.second].push({sol[atual.first][atual.second], atual});
  86.             }
  87.             continue;
  88.         }
  89.         pair<int,int> aux=vis[cur.first][cur.second].top().second;
  90.         vis[cur.first][cur.second].pop();
  91.         juntar(cur, aux);
  92.         cur=achar(cur);
  93.         ordem.push({resp[cur.first][cur.second], cur});
  94.     }
  95.  
  96.     for(int i=0; i<n; i++){
  97.         for(int j=0; j<m; j++){
  98.             cout << sol[i][j];
  99.             if(j!=m-1)cout << ' ';
  100.         }
  101.         cout << '\n';
  102.     }
  103.  
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement