codeforces 892E取消互いに素セット

https://codeforces.com/problemset/problem/892/E

お問い合わせは、ステップバイステップの答えオフラインです。

#include <ビット/ STDC ++。H>
#define LL長い長いです
#define担当者のための(II、a、b)は(INT II = A; II <= B; ++ II)
ためあたりの#define(II、a、b)は(INT II = B; II> =;  -  II)
#define forn(I、X、G、E)は(INT I = G [X]; iは、iは= E [I] .next)
#define IO IOS :: sync_with_stdio(偽); cin.tie(0); cout.tie(0)
#define ULL符号なしの長い長いです
#define Fiの最初の
#define SE秒
#define融点make_pair
#define PIIペア<int型、int型>
全ての#define(X)x.begin()、x.end()
#defineショー(X)COUT <<#X << "=" << X << ENDL
#define show2(X、Y)COUT <<#X << "=" << X << " "<<#1 Y <<"=" << Y << ENDL
#define SHOW3(X、Y、Z)COUT <<#X << "=" << X <<」 "<<#1 Y <<" = "<< Y <<" "<<#zの<<" = "<< Z << ENDL
<< "=" << W << " "<<#X <<"= "<< X <<"" <<#1 Y Wの#define show4(W、X、Y、Z)COUT <<#< < "=" << Y << " "<<#Z <<"=" << Z << ENDL
#define show5(V、W、X、Y、Z)COUT <<#V << "=" << V << " "<< W#<<"= "<< W <<"" <<# X << "=" << X << " "<<#Y <<"= "<< Y <<" "<<#Z <<"=" << Z << ENDL
#define昭和(X、a、b)はCOUT <<#X << ":";担当者(I、a、b)はCOUT << X [i]は<<」「; COUT << ENDL
//ヘッド; std名前空間を使用して
CONST INT MAXN = 1E6 + 10、MAXM = 2E6 + 10。
CONST LL INF = 0x3f3f3f3f、MOD = 1E9 + 7。
int型CASN、N、M、K。
クラスUFS {パブリック:
  前INT [MAXN] SZ [MAXN]。
  スタック<PII> STK。
  空のinit(int型TOT){
    [I] = I、SZ [I] = 1になり(一、が)受信します。
  }
  int型の検索(現在のint){
    (現在[今] FAは==)が戻った場合、
    リターンのfind(FA [今]);
  }
  BOOL {(INT BをINT)団結
    =()を見つける、B =(B)を見つけます。
    (== b)は場合は0を返します。
    IF(C [I] <C [B])ツリー[I] = B、C [B] + = C [i]は、stk.push(make_pair(b)参照)。
    他FA [B] = A、SZ [A] + = SZ [B]、stk.push(make_pair(B))。
    1を返します。
  }
  ボイドアンドゥ(){
    (もし!stk.empty()){
      今、オート= stk.top();
      stk.pop();
      FA [now.fi] = now.fi。
      SZ [now.se]  -  = SZ [now.fi]。
    }
  }
DSU;
構造体ノード{からコスト、にINT ID;} E [MAXN]。
ベクター<ノード> [MAXN]。
ブールCMP(int型B、INT){戻りE [A] .cost <E .cost [B];}
ベクター<整数> B [MAXN]、Q [MAXN]。
INT年[MAXN]。
BOOLチェック(INT ID、からINTにINT){
  BOOL RES = 1。
  int型の合計= 0;
  担当者{(I、へ、から)
    IF(dsu.unite(E [Q [ID] [I]、E [Q [ID] [I])に、より。)++和。
    それ以外のres = 0;
  }
  担当者(I、1、和)dsu.undo();
  解像度を返します。
}
{IOメインINT()。
  CIN >> N >> M。
  担当者(I、1、M){
    CIN >> E [i]の.from >> E [i]の.TO >> E [i]の.cost。
    B [E [i]は.cost] .push_back(I)。
  }
  cinを>> K;
  担当者(I、1、K){
    int型のC; cinを>>はありません。
    担当者(_、1、C){
      int型はX; cinを>> X;
      Q [i]は.push_back(X)。
    }
    ソート(全て(Q [i])と、CMP)。
    = 0からint型。
    担当者(J、1、S-1)
      IF(E [Q [I] [J]。コスト!= E [Q [I] [J-1]]。コスト){
        A [E [Q [I] [J-1]]コスト] .push_back({I、Jから-1,0})。
        = J;
      }
    A [E [Q [I] [SZ-1]]コスト] .push_back({I、からSZ-1,0})。
  }
  dsu.init(N)
  担当者(I、1、MAXN-5){
    ([I]ノードj)のための 
      (もし!チェック(j.id、j.from、j.to))
        年[j.id] = 1。
    (:B [i]はint型j)のための
      dsu.unite(E [J] .from、E [J] .TO)。
  }
  担当者(I、1、K)(ANS [i])とCOUT << "NO \ n" であれば、
  他の裁判所未満<< "YES \ N";
  0を返します。
}

 

おすすめ

転載: www.cnblogs.com/nervendnig/p/11881391.html