フェイス質問
https://www.luogu.org/problem/P4251
問題の解決策
// luogu-判定部イネーブル-O2 の#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <ベクトル> の#include <アルゴリズム> の#define RIレジスタint型 の#define N 300 使用して名前空間STDを、int型読み取り(){ int型 RET = 0、F = 0。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 ')は、f | =(CH == ' - ')、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')RET = RET * 10 +(CH- ' 0 ')、CH = GETCHAR()。 リターン F - ?RET:RET; } int型、M、N、K、ティム、ANS [N]。 INT VA [N] [N]。 ベクター < INT > 乃至[N]。 INT VIS [N]、一致[N]。 BOOL DFS(INT X){ ため(RI i = 0 ; iが<[X] .size(); iは++ ){ int型、Y = に[X] [I]; もし(VIS [Y] == TIM)続け; VIS [Y] = ティム。 もし(!一致[Y] || DFS(一致[Y])){ 一致[Y] =のX。 リターン 1 ; } } 戻り 0 。 } int型のチェック(INT X){ ため(RI i = 1 ; I <= N; iが++ )への[I] .clear(); memset(一致、0、はsizeof (一致))。 memsetの(VIS、0、はsizeof (VIS))。 以下のために(RI iが= 1 ; iが<= N; iは++ ) のため(RI J = 1 ; J <= Mであり、j ++)場合(VA [i]は[J] <= X)[i]を.push_back(j)に、 ティム = 0 ; int型 CNT = 0 ; 用(RI i = 1 ; iが<= N iが++ ){ ++ ティム。 もし(DFS(i))をCNT ++ ; } 戻りCNT。 } int型のmain(){ N)=(読み取り; M =読み取ります(); K = リード()。 K = N-K + 1 。 用(RI i = 1 ; I <= N; I ++ ) のための(RI J = 1; J <= Mであり、j ++)VA [I] [Jは= 読み取ります(); int型ポンド= 0、RB = 1E9; int型 RET = RB; 一方、(LB <= RB){ int型ミッド=(LB + RB)>> 1 。 もし(チェック(MID)> = K)RET =中間、RB =半ば1。他ポンド=ミッド+ 1 ; } のprintf(" %d個の\ n " 、RET)。 リターン 0 ; }