Advertisement
111-111-111

DSU paint

May 23rd, 2020
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <stdlib.h>
  6. #include <set>
  7. #include <map>
  8. #include <queue>
  9. #include <unordered_map>
  10.  
  11.  
  12. using namespace std;
  13. //DSU
  14. struct dsu
  15. {
  16.     vector<int> parent;
  17.     vector<int> sz;
  18.     vector<int> end;
  19.    
  20.     dsu(int n)
  21.     {
  22.         parent=vector<int>(n);
  23.         end=vector<int>(n);
  24.         for(int i=0;i<n;i++)
  25.         {
  26.             parent[i]=i;
  27.             end[i]=i;
  28.         }
  29.         sz=vector<int>(n,1);
  30.     }
  31.    
  32.     int find_(int x)
  33.     {
  34.         int root=x;
  35.         while(root!=parent[root])
  36.             root=parent[root];
  37.        
  38.         //Path compression
  39.         while(parent[x]!=root)
  40.         {
  41.             int p=parent[x];
  42.             parent[x]=root;
  43.             x=p;
  44.         }
  45.         return root;
  46.     }
  47.     bool union_(int x,int y)
  48.     {
  49.         int X=find_(x);
  50.         int Y=find_(y);
  51.         // x and y are already in the same set
  52.         if(X==Y)
  53.             return false;
  54.         // x and y are not in same set, so we merge them
  55.         if(sz[X]<sz[Y])
  56.             swap(X, Y);
  57.         // merge yRoot into xRoot
  58.         parent[Y]=X;
  59.         sz[X]+=sz[Y];
  60.         end[X]=max(end[X],end[Y]);
  61.         return true;
  62.     }
  63. };
  64.  
  65. int main(){
  66.     ios::sync_with_stdio(0);
  67.     int n,q;
  68.     cin>>n>>q;
  69.     dsu uf(n+1);
  70.     vector<int> answer(n,0);
  71.     vector<pair<int, pair<int, int>>> queries(q);
  72.     for(int i=0;i<q;i++)
  73.     {
  74.         cin>>queries[i].first>>queries[i].second.first>>queries[i].second.second;
  75.     }
  76.    
  77.     reverse(queries.begin(), queries.end());
  78.    
  79.     for(int i=0;i<q;i++)
  80.     {
  81.         int l = queries[i].second.first;
  82.         int r = queries[i].second.second;
  83.         int c = queries[i].first;
  84.         for (int v = uf.end[uf.find_(l)]; v <= r; v = uf.end[uf.find_(v)]) {
  85.             answer[v] = c;
  86.             uf.union_(v, v+1);
  87.         }
  88.     }
  89.     for(int i=0;i<n;i++)
  90.     {
  91.         cout<<answer[i]<<" ";
  92.     }
  93.    
  94.        
  95.     return 0;
  96. }
  97. /*
  98.  input:
  99.  10
  100.  5
  101.  1 0 9
  102.  2 8 9
  103.  3 6 8
  104.  4 0 6
  105.  5 6 8
  106.  output:
  107.  4 4 4 4 4 4 5 5 5 2
  108.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement