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を返します。 }