このタイトルはそれを行うには二回目であるかのように?
最終知らないどのようにO(N ^ 3)過去のカード、本当にNiubi。。。。
これは、まともなO(N ^ 2)で行われます。
我々はそれに長方形の統計の右下隅に考慮し、次に描画がアップポイントまで延びるとみなすことができる値のこのラインの各点の重量に等しい矩形の右下隅のポイントの数で見つけることができドロー番号は、その後単調にこれらの重みから成るスタック(立ち上がり)σH[S [I](S [i]を-s [I-1])(二次元平面を積層するように描か即ち単調パターン領域)この値は、すべての左端ポイントの数だけであるので、場所に取り込むことができます。
あの、その後、単調スタックメンテナンス、O(N ^ 2)のように直接実行
#include <ビット/ STDC ++ H> の#defineは長い長いllの 名前空間stdを使用します。 const int型N = 1005; INT H [N]、N、M、今、S [N]、TP。 文字chを、 ANS LL; INTメイン(){ scanf関数( "%d個の%のD"、&N、&M)。 以下のために(; iは= N <; I = 1 int型TP =今= 0、iは++) のために(INT J = 1; J <= Mであり、j ++){ CH = GETCHAR()。 (! ' '!CH = && CH =' *')しばらくCH = getchar関数(); H [J] = CH == H [J] +1 '':0。 一方(TP && H [J] <= hの[S [TP]])NOW- =さh [S [TP]] *(S [TP] -s [TP-1])、tp--。 S [++ TP] = J、今+ = H [J] *(S [TP] -s [TP-1])。 今ANS + =(LL)。 } のprintf( "%LLDする\ n"、ANS)。 0を返します。 }