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。 } }