リンク:https://ac.nowcoder.com/acm/contest/1083/D
出典:牛オフネットワークが
草原は1〜400の軸表現から番号にすることができます。羊とn個のQクエリがあります。各羊の番号が1,2,3 ... nです。Iだけ羊シャフト[AI、BI]このような閉じた間隔の数、各羊が自分の好きな部分の特定の時点でのみ可能放牧毎など。今Qクエリ、各クエリ二つの整数のL、Rを与え。あなたは、同じ時間間隔で羊の放牧の数まで、同時に動作するようにする必要があります。同一時点で各整数ラインのみヒツジ、ヒツジ放牧だけ全体のポイントに対応することができます。
最初の三つの行番号NQ。
二行数n A1、A2 ...。
3番目の列数N B1、B2 ... BN。
次の2行の各数qのL、R。間隔問合せを示します。
入力:
5 3 1 1 1 2 4 1 1 1 3 5 1 5 2 5 1 3
出力:
3 2 2
アイデア:
、ヤン1 ...集合Aに属するN Bを設定するために属する座標軸セットの全体のポイント... 400、[i]は、我々はセットBのI B [i]のような羊の間隔の数、iについてセットポイントと[i]の間の点...のb [i]の一つでもこのグラフに見られるエッジは、二部グラフです。だから、各クエリリットルに対して、R、我々は、rの間のすべてのポイントを列挙最大マッチングのコレクションを見つける...リットルを設定します。ハンガリーのアルゴリズムは十分か、最大流量良いことができます。[レイジー、説明QAQに直接移動]
ここでは、コードIハンガリーのアルゴリズムは次のとおりです。
#include <ビット/ STDC ++ H> 使用して名前空間STDを、CONST INT MAXN = 510 。 INT [MAXN]。 INT [MAXN] B。 int型の一致[MAXN]。 int型のブック[MAXN]。 INT G [MAXN] [MAXN]。 int型のL、R。 INT DFS(INT U){ // 模板ため(INT I = 1; I <= R; iは++ ){ 場合(ブック[I] == 0 && G [U] [I] == 1 ){ ブック[I] = 1 ; もし(== [i]が一致 0 || DFS(一致[I])){ 一致[I] = U。 // 一致[U] = I。 リターン 1 ; } } } 戻り 0 。 } int型のmain(){ int型N、Q。 CIN >> N >> Q; 以下のために(int型私= 1 ; iが<= N; iが++ ) のscanf(" %dの"、および[I])。 以下のために(int型 i = 1 ; iが++; iが<= N ) (scanf関数を" %のD "、&B [I])。 一方、(Q-- ){ memsetの(G、0、はsizeof (G))。 scanf関数(" %dの%のD "、&L&R)。 以下のために(int型 i = 1 ; iは<N =、iは++ ){ 場合([i]が> = Lの&&のB [i]は<= R){ ため(INT J = [i]は、J <= B [i]は、 J ++ ){ G [I] [J] = 1 。 } } そう であれば([I] <= R && B [i]は> =R){ ための(int型 J = L; J <= R; J ++ ){ G [I] [J] = 1 。 } } そう であれば([I] <= L && B [i]は<= R){ ため(INT J = L; J <= bの[I]; J ++ ){ G [i] [j]は = 1 。 } } そう であれば([I]> = Lの&&のB [i]が> = R){ ため(INT J = [i]は、J <= R; J ++ ){ G [I] [J] = 1 。 } } } int型 ANS = 0 。 memset(一致、0、はsizeof (一致))。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ memsetの(書籍、0、はsizeof (書籍))。 もし(DFS(i))を ANS ++ ; } のprintf(" %d個の\ n " 、ANS)。 } 戻り 0 。 }
D | 羊の放牧 |