CF1276C美しい長方形

CF1276C美しい長方形

問題の意味

接続

問題の解決策

明らかに、最も頻繁に出現数が少ない特定の行よりも、この時間は、列の数が行数よりも大きくなければなりません、または手放すことはできません表示される

各番号の優先順位の出現回数によって

作品を降順配慮は、すべての最大化に列の数を開催

ごとに行数の多い順に番号が、負け、および利用可能な要素を更新するよりも大きい場合

、明らかにあなたは今あまりにももう使用されていない未来よりも、下りのラインを列挙

だけで、各要素ので、一度削除され、これはO(n)で

斜めに充填する際の充填の数

以下のコードは

#include <ビット/ STDC ++ H> 使用して名前空間STDを、#defineがレジスタ再
インラインint型のリードを()
{ int型のx = 0、F = 1 CHAR CH;
    実行
    { 
        CH = GETCHAR()。
        もし(CH == ' - ' F =) - 1 
    } 一方、(CH < ' 0 ' || CH> ' 9 ' )。
    実行
    { 
        X =(x << 3

 



    )+(X << 1)+ CH - ' 0 ' 
        CH = GETCHAR()。
    } 一方、(CH> = ' 0 ' && CH <= ' 9 ' )。
    リターン F * X; 
} 

CONST  INT MAXN = 4E5 + 10 

int型のn;
int型[MAXN]。
int型B [MAXN]、合計; 
マップ < int型int型 > VIS;
int型TOT;
int型ansx、ansy。
ペア < int型INT > C [MAXN]。
int型M [MAXN];
int型のres; 

INT メイン()
{ 
     N = 読み取ります()。
     以下のためにINT iが= 1 ; I <= N; I ++)[I] = )(読み取ります。
     ソート( + 1、+ N + 1 )。
     以下のためにINT iが= 1 ; I <= N; I ++ 
     { 
         場合(![I] = [I- 1 ])B [I] = ++ 和を、
         他の B [i]は= 合計。
         VIS [B [I] = [I]。
     }
     ためINTは iは= 1 ; I <=和; I ++)Cを[I] .second = I。
     以下のためにINT iが= 1 C [B [I]第++; I <= NのI ++) 
     ソート(C + 1、C +和+ 1); TOT = N。
     INT ; I> = I = N 1 ; i-- 
     { 
         ためINT J =和; J && C [j]が1次回> I; j-- 
         { 
             C [J] 1次回 - 
            TOT - ;    
        } 
        INT P = TOT /私;
        もし(P <ⅰ)続けますもし(RES <P * I)
        { 
            RES = P * I。
            ansx = I、ansy = P; 
        } 
     } 
     のためにINT iは= 1 ; I <=和; I ++ 
     { 
         C [i]が1次回 = 0 ; C [i]は.second = I。
     } 
     ためINT iは= 1 ; I <= N; I ++)C [B [I]第++。; 
     coutの << RES <<てendl << ansx << "  " << ansy << てendl; 
     ソート(C + 1、C +和+ 1 )。
     以下のためにINT iが合計=; I> = 1 ; i-- 
     { 
         もし、(C [i]が1次回> = ansx)C [i]が1次回= ansx。
         他に 休憩; 
     } 
     INT P = 和。
     以下のためにINT iが= 1 ; I <= ansy; I ++ 
     { 
         ためINT J = 1 ; J <= ansxあり、j ++ 
         { 
             もし、(C [P] 1次回== 0)P-- 
             M [(j - 1)* ansy +(I + J)%ansy + 1 ] = VIS [C [P] .second]。
             C [P] 1次回 - 
        } 
     } 
     のためにINT iは= 1 ; I <= RES; I ++ 
     { 
         COUT << M [I] << "  " もし(I%ansy == 0)COUT << ENDL。
     } 
}

おすすめ

転載: www.cnblogs.com/wlzs1432/p/12048761.html