Advertisement
Anon2005

regate

Mar 30th, 2023
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #pragma GCC optimize("Ofast")
  3. using namespace std;
  4. ifstream in("regate.in");
  5. ofstream out("regate.out");
  6. vector <int> v[400001],down[400001];
  7. struct mazan
  8. {
  9.     int a,b,c;
  10. } muchii[400001];
  11. bool viz[400001];
  12. bool bad[400001];
  13. long long ans[400001];
  14. int r[400001],cnt,n;
  15. int dp[400001];
  16. int daddy[400001];
  17. long long sz[400001];
  18. int papa[400001];
  19. int steve[400001],vf;
  20. vector <int> bicon[400001];
  21. bool cmp(mazan a,mazan b)
  22. {
  23.     return a.c>b.c;
  24. }
  25. void biconex(int nod,int papa)
  26. {
  27.     viz[nod]=1;
  28.     steve[++vf]=nod;
  29.     for(auto it:v[nod])
  30.     {
  31.         int y=muchii[it].a+muchii[it].b-nod;
  32.         if(y!=papa&&viz[y])
  33.         {
  34.             dp[nod]++;
  35.             dp[y]--;
  36.         }
  37.     }
  38.     for(auto it:v[nod])
  39.     {
  40.         int y=muchii[it].a+muchii[it].b-nod;
  41.         if(!viz[y])
  42.         {
  43.             biconex(y,nod);
  44.             dp[nod]+=dp[y];
  45.         }
  46.     }
  47.     if(dp[nod]==0)
  48.     {
  49.         daddy[nod]=++cnt;
  50.         bicon[cnt].push_back(nod);
  51.         while(steve[vf]!=nod)
  52.         {
  53.             daddy[steve[vf]]=cnt;
  54.             bicon[cnt].push_back(steve[vf--]);
  55.         }
  56.         vf--;
  57.     }
  58. }
  59. int fada(int nod)
  60. {
  61.     if(papa[nod]==nod)
  62.         return nod;
  63.     return papa[nod]=fada(papa[nod]);
  64. }
  65. int suprem;
  66. void join(int a,int b,int c)
  67. {
  68.     int ra=fada(a),rb=fada(b);
  69.     if(ra==rb)
  70.         return;
  71.     if(bad[ra])
  72.     {
  73.         papa[ra]=rb;
  74.         down[rb].push_back(ra);
  75.         ans[ra]-=ans[rb];
  76.         ans[ra]+=c*sz[rb];
  77.         suprem=rb;
  78.         return;
  79.     }
  80.     if(bad[rb])
  81.     {
  82.         papa[rb]=ra;
  83.         down[ra].push_back(rb);
  84.         ans[rb]-=ans[ra];
  85.         ans[rb]+=c*sz[ra];
  86.         suprem=ra;
  87.         return;
  88.     }
  89.     if(sz[ra]>sz[rb])
  90.     {
  91.         papa[rb]=ra;
  92.         down[ra].push_back(rb);
  93.         ans[rb]-=ans[ra];
  94.         ans[ra]+=c*sz[rb];
  95.         ans[rb]+=c*sz[ra]-c*sz[rb];
  96.         sz[ra]+=sz[rb];
  97.         suprem=ra;
  98.     }
  99.     else
  100.     {
  101.         papa[ra]=rb;
  102.         down[rb].push_back(ra);
  103.         ans[ra]-=ans[rb];
  104.         ans[rb]+=c*sz[ra];
  105.         ans[ra]+=c*sz[rb]-c*sz[ra];
  106.         sz[rb]+=sz[ra];
  107.         suprem=rb;
  108.     }
  109. }
  110. void update(int nod)
  111. {
  112.     for(auto it:down[nod])
  113.     {
  114.         ans[it]+=ans[nod];
  115.         update(it);
  116.     }
  117. }
  118. int main()
  119. {
  120.     int i,m;
  121.     in>>n>>m;
  122.     for(i=1; i<=n; i++)
  123.     {
  124.         in>>r[i];
  125.         muchii[i]= {i,n+i,r[i]};
  126.         v[i].push_back(i);
  127.         v[n+i].push_back(i);
  128.     }
  129.     for(i=1; i<=m; i++)
  130.     {
  131.         in>>muchii[n+i].a>>muchii[n+i].b>>muchii[n+i].c;
  132.         v[muchii[n+i].a].push_back(n+i);
  133.         v[muchii[n+i].b].push_back(n+i);
  134.     }
  135.     biconex(1,0);
  136.     for(i=1; i<=n+m; i++)
  137.     {
  138.         muchii[i].a=daddy[muchii[i].a];
  139.         muchii[i].b=daddy[muchii[i].b];
  140.     }
  141.     for(i=n+1; i<=2*n; i++)
  142.         bad[daddy[i]]=1;
  143.     sort(muchii+1,muchii+n+m+1,cmp);
  144.     for(i=1; i<=cnt; i++)
  145.     {
  146.         papa[i]=i;
  147.         sz[i]=bicon[i].size();
  148.     }
  149.     //for(i=1; i<=n+m; i++)
  150.     //if(muchii[i].a!=muchii[i].b)
  151.     //out<<muchii[i].a<<" "<<muchii[i].b<<" "<<muchii[i].c<<'\n';
  152.     for(i=1; i<=n+m; i++)
  153.         join(muchii[i].a,muchii[i].b,muchii[i].c);
  154.     update(suprem);
  155.     for(i=n+1; i<=2*n; i++)
  156.         out<<ans[daddy[i]]-r[i-n]<<'\n';
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement