test20190815 NOIP2019シミュレーションタイトル

100 + 60 + 40 = 200は、私と一緒に2枚のタイトルカードの後ろに非常に不幸です。

キューブ番号

[問題の説明]
自分の好きなチームを参照してくださいMdZzZZ XX一族の大ファンとしては、突然落胆、準決勝で失いました。彼らの手の中に決勝戦のチケット価格の高騰をつかむためにそこに牛を見てからは、MdZzZZは巣に感じては意味がありませんので、彼はジャンプすることを決めた「ウォーターキューブ」を 彼は「ウォーターキューブ」競技場に入る準備ができていたときに、叔母は彼の方法で停止し、対話のビットを持っていました:

おばさん:「若い男は私がそう言う可能性がある場合、これは彼の党の不測の事態に行くことを恐れてはどうなるかで、あなたは印堂は黒だと思う。」
MdZzZZは:「!母は私を停止しないでください、私は立方ベントを潜りたい」
おばさん:「若い男、考え直すべき事、あなたは「?それはまだ最も有名なウォーターキューブが何であるかを知っている
MdZzZZ:」私は...「知らない
母:」!これは最も有名なウォーターキューブ「キューブ」ですが、「
MdZzZZ:」ああ、 "?
おばさん:..「『キューブ』が持って慎重に私に聞いて、心配しないで、数の3乗場合は、この数は、立方体の数は書くこともある正の整数であり、例えば、それが最小の3-1,8,27です立方体の数「
MdZzZZ:」......「
母:」!もちろん、あなたが来て、あなたは'「立方数の違い」知っている必要があり、この水キューブに行きたい
:「数が立方2のように書くことができれば母数の違いは、この数は「立方差の数」で、例えば、図7(8-1)、26(27-1)、19(27-8)は、立方体の違いです。あなたはわずか数を決定することができない場合「立方貧困層の数」、そしてあなたは、こののんきで、本当に小さな世界は小魚ができます... "

そしておばさんに、反応していない他のMdZzZZはあそこに慎重に検討するために、単独で彼を残して、離れて漂流しました。だからあなたの質問は今、あなたがこの問題を解決するMdZzZZ助けを必要としています。さて、数P与えられ、MdZzZZは、この数は立方貧しい人々の数ではありません知ってほしいです。

もちろん、そのための規定Pが素数であるMdZzZZ ......あなたは、ランダムな出力にいくつかの奇妙なことがあるかもしれませんので、MdZzZZ T〜時間は、この質問はあまりにも難しいかもしれ依頼することがあります!

[入力形式
cubicp.inと呼ばれるファイルに。最初の
Tの数のライン、データのTセットが発現しました。
次T線、各ラインPの数

[]出力形式の
出力ファイル名cubicp.out。立方、出力の数が「YES」、そうでなければ「NO」を出力する場合の数の各差のためにT個の出力ライン。

試料1 [O]
cubicp.in
。5
2
。3
。5
。7
。11
cubicp.out
NO
NO
NO
YES
NO

[データサイズと一致]
データp <= 100の30%。
データp <= ^ 6〜10の60%。
データp <= 10 ^ 12、Tの100%に <= 100。

noip2018シミュレーションゲームキューブの数2

\ [P = A ^ 3-B ^ 3 =(A-B)(A ^ 2 + AB + B ^ 2)\\ \なぜならP \\ \のP \従ってAB = 1、P = A ^ 2 + AB +従って^ 2 +(a-1)+( - 1)^ 2 = P \\ \従って= \ FRAC {3+の\ SQRT {12P-3}} {6} \ B ^ 2 \\ \ ]

int main(){
    freopen("cubicp.in","r",stdin),freopen("cubicp.out","w",stdout);
    for(int t=read<int>();t--;){
        LL p=read<LL>();
        int a=(3+sqrt(12*p-3))/6;
        puts(p==3LL*a*a-3*a+1?"YES":"NO");
    }
    return 0;
}

ダイナミックプログラミング

[問題の説明]
究極の難解な生活を実現した後MdZzZZは、私は彼らの魂を浄化チベットに行くことにしました。彼は突然の景色を楽しみながら羊の大きな群れが視線に押し入りあります。

n個の羊の群れの合計場合、直線に入れ、そして羊の各標準値へ:質問のこの場合MdZzZZ考えでは、質問はこれです。値は、この同じ間隔数の対数のインターバル期間として定義されます。これらの羊の値を計算した後、このセグメントを正確にk個の間隔に群れするMdZzZZはn及びk値セグメント間隔です。MdZzZZは今、究極の、このn個の羊の値とできるだけたいです。

例えば、6匹の羊は1,1,2,2,3,3の価値だった、そして今、彼らは3つのセクションにカットします。唯一の第3のセクションは、1の値を有するように、直ちに、[2,3,3]、[1,2]、[1]に、良い方法であったMdZzZZ。だから、これらの6匹の羊と1の値。MdZzZZは、より多くの羊を探索するために考えたとき、彼は助けることはできませんが、その後MdZzZZ深く内部の思考の世界に浸漬...物思いにふけって、眠りに落ちました。

しかし、良い時代はいつもすぐに行くには非常に短いので、暗い日です。MdZzZZは暗くなる前にホテルを見つけて滞在する必要があります。あなたは今MdZzZZは、この問題を解決するため、できるだけ早く彼を覚ますする必要があります。もちろん、あなたが最初の問題を解決しなければならないし、その後、彼を覚ます、または残すために難色を示してきたMdZzZZは、ガスを取ることがあります。

[入力形式
dp.in.と呼ばれるファイルには、
最初の2つの行番号N、K。
次AIの数を表し、nは、行番号n。

[]出力形式の
出力ファイル名dp.out。
番号は、その答えを示しています。

試料1 [O]
dp.in
10 2
1 2 1 2 1 2 1 2 1 2
dp.out
。8

[データサイズと一致]
データn <= 10の30%。
nのデータの60%<= 1000。
データ1の100%に<= N <= 100000,1 < = K <=分(N、20)、1 <=は<= N愛。
前記30%同一のデータを満たす均一すべてのデータに分布aiを。

CF686Fもう一つの最小化問題

DPは、第一方程式書き込み
[F(I、K)\ \(J + 1、i)はW + = \ MIN_ {0 \当量のJ <I} F(J、K-1)]

ので\(K \)が小さいないので、不要二部誘導体斜面。その背後に考えてみましょう\(W \)不等式四角形を満たす機能、。

これは非常に直感的で、≥4つの線分の画像が交差含まれていることを考えると、あなたは反例ではないことがわかります。

証明を試みる\(\ FORALL A <B \)
\ [W(A、Bが+ 1)+ W(A + 1、B)\ GEQ W(A、B)+ W(A + 1、B用+ 1)\ ]
転置与える
\ [W(B +
1)-w(B)\ GEQ W(A + 1、B + 1) - (A + 1、B)\] wは、次式かなりの差で\([B] \ ) と\([A + 1、B ] \) グリッドの増加を拡大する右に、そしてそれはこの関係のサイズことは明らかです。

以来(W \)\寄与を迅速に算出し、これを使用することができない範囲の分割及びアプローチを征服します

現在の設定間隔について解く\([L、R&LT] \) 最適な決定間隔\([L、R&LT] \) 現在のパーティションの中間点について\(MID \) 我々はする必要があります([L、\分(\ R、半ば)] \) 、最適な意思決定を見つけるために暴力を\(k個の\を)ノート\(W(L、R) \) する\(W(L、R + 1)\) 又はから\((L、R)は、W \) する(\ W(L + 1、 R)\ 全て行うことができる\(O(1)\) 各色の現在の間隔の限りオープンバレルレコード番号は、すべての権利であると思われます。ポインタ\(私は\)から\(Lの\)に移動\(\分(R、半ば )\) とカウントし続ける(F(I)+ W(I、MID)\)\結局見つけ、\ (K \)

ゾーンが解決入るとき、我々は確認する必要があることに注意してください\([L、L-1 ] \) プレゼンス情報、分割の複雑さとは、征服することを確実にするように。

だから我々は、サブサブ問題に入る前に問題に対処する方法の答えを考えます。左部分問題(ルック\([L ,. 1-MID]、[L、K] \) および見かけ現在の問題を\([L、L-1 ] \) と同じです。私たちは追求していることに注意してください\(k個\)する時間\(\ w)の樽が変更されている、我々は削減を指示することができますバック左側のサブ問題になりました。

右サブ問題?(\ ([MID +。1、R&LT]、[K、R&LT] \) 前処理されるべき\([K、MID] \) および電流は([L、L-1 \ ] \) 。したがって、右から我々第1の点ポインタ\(L-1 \)に移動\(MID \)およびタブ\(W \)はに結合され、そして、左の点から\(Lの\)に移動\(K \ )、バケツと\(\ w)は、次にように、失われます。復元するバック時間または\([L、L-1] \) 続いて使用される上部層以降を、。

LaTeXの図面と相まって?

間隔を解く:\(| Lの\のFRAC {\ | \の前処理に\を取得
qquad \ qquad \ qquad \下矢印^ {中間} \ qquad \ qquad \ qquad} {} R \) :判定部\(Lの\ {FRAC \ qquad \ qquad \ qquad \ qquad \下矢印^ {K} \ qquad \ qquad \ qquad} {}のR \)

検査では見つけることがあまりにもナイーブだった、と曲がって前進すると、\(\ w)が単調に見えるものの表現です。私はまた、私が直接テーブルをヒットしようとしませんでした......意味から見て期待していませんでした。私はより多くのスキル試験の推測を持っている必要があるかもしれないと感じ。

時間複雑\(O(NK \ N-ログ)\)

co int N=100000+10;
int n,k,a[N],b[N];
LL f[N],g[N];

void solve(int l,int r,int L,int R,LL w){
    if(l>r) return;
    int mid=(l+r)>>1,p=min(mid,R),k=0;
    for(int i=l;i<=mid;++i) w+=b[a[i]]++;
    for(int i=L;i<=p;++i) w-=--b[a[i]],f[mid]>g[i]+w?f[mid]=g[i]+w,k=i:0;
    
    for(int i=l;i<=mid;++i) w-=--b[a[i]];
    for(int i=L;i<=p;++i) w+=b[a[i]]++;
    solve(l,mid-1,L,k,w);
    
    for(int i=L;i<k;++i) w-=--b[a[i]];
    for(int i=l;i<=mid;++i) w+=b[a[i]]++;
    solve(mid+1,r,k,R,w);
    
    for(int i=l;i<=mid;++i) --b[a[i]];
    for(int i=L;i<k;++i) ++b[a[i]];
}
int main(){
    freopen("dp.in","r",stdin),freopen("dp.out","w",stdout);
    read(n),read(k);
    for(int i=1;i<=n;++i)
        g[i]=g[i-1]+b[read(a[i])]++;
    memset(b,0,sizeof b);
    while(k--){
        memset(f,0x3f,sizeof f);
        solve(1,n,1,n,0);
        swap(f,g);
    }
    printf("%lld\n",f[n]);
    return 0;
}

ゲーム

[問題の説明]
彼の友人がポケモンゴーをプレイしているので、最近非常に動揺MdZzZZ!、そして、彼は常にこのタイプのゲームの否定されているので、誰もがプレーするために、毎日彼に来ませんでした。私は新しいゲームをしたいMdZzZZだから、彼は誇らしげにゲームを推測するこれらのゲームは、名前付き。

ゲームのルールはこれです:正の整数nは、最小範囲の各期間を推測することができ、互いに異なる、MdZzZZがあります。例えば、特定の最小間隔[リチウム、RI]が存在しなければなりません。

そこで彼は、彼の友人がこのゲームをプレイするために招待さWdZzZZ幸せです。だから、MdZzZZ誇りに思って、このゲームでは、彼が構築できることをスキームは......は、自分の推測が矛盾しているWdZzZZまでWdZzZZ満足してます!例えば、[1,5]の最小数は2 [1,6]の最小値は明らかに矛盾している、3である推測WdZzZZ。

今、あなたはMdZzZZの判断を支援するために必要な、始まりを推測WdZzZZには多くの時間が矛盾してきました。

[入力形式
number.inと呼ばれるファイルに。最初の二つの数n及び行Tは、
LYKがT時間を推測し、N個のデジタル表現しました。
3つの数字の次T線は、Li、RIおよびXIを表します。

[]出力形式の
出力ファイル名number.out。数の出力は、矛盾した登場回数を示し
競合がある場合、出力T + 1されていません。

試料1 [O]
number.in
20である。4
1 7 10
5 19 7
3 8〜12である
20 1

number.out
3

[データサイズと一致]
データn <= 8、T <= 50%と 10。
nのデータの80%<= 1000、T <= 1000
データの100%まで1 <= nは、T <= 1000000,1 <=李<= RI <= nは、1 <= XI <= N( しかし、すべての数字は1〜nに始めていることを保証するものではありません) 。

[ヒント]最適化を読んでお勧めします

ChiTongZの問題への解決策

直接ポジ溶液、オフライン動作、およびその動作の半分は、現在の間隔のための操作をハングアップ、それは第三の重量に応じて降順にソート装置。

これは、いくつかのケースでは、大量の範囲は、小さな重みが及ぶカバーし、続いて最初の二つの互いに素区間の数に登場し、考慮するだけでは十分ではない、その後、何もそこではありません。

第二の場合は、交差点を取ることに注意し、交点が重みの現在の範囲の所有値です。

だから、最初のケース、直接LMAXは、その上に交差点を維持RMIN。if (lmax > rmin) return 挂了;

そして、第2の場合について、公称の優れた互いに素なセットアプローチが提供される互いに素セットを右端点I pを延びる各要素を維持することです。これは、更新するように設定最後に、それぞれのxに基づいています。

であり、現在の交差点がある場合、ソート降順を考慮[LMAX、RMIN]及び(標準プロセスによって理解することができます)find(lmax) > rmin

現在の重みのでまだ互いに素な集合を更新するので、間隔のみ電流範囲、及び前にいくつかのより大きな量の範囲をカバーするので、状況が正当でない前に、状況2つに属します。

時間複雑\(O(T \ Tをログ)\)

co int N=1000000+10;
int n,T,fa[N];
struct node{int l,r,x;}p[N],e[N];

il bool operator<(co node&a,co node&b){
    return a.x>b.x;
}
int find(int x){
    return x==fa[x]?x:fa[x]=find(fa[x]);
}

bool check(int k){
    for(int i=1;i<=n+1;++i) fa[i]=i;
    copy(e+1,e+k+1,p+1),sort(p+1,p+k+1);
    int lmax=p[1].l,lmin=p[1].l,rmax=p[1].r,rmin=p[1].r;
    for(int i=2;i<=k;++i){
        if(p[i].x<p[i-1].x){
            if(find(lmax)>rmin) return 0; // 交集被覆盖 
            for(int j=find(lmin);j<=rmax;++j) // 并集合并
                fa[find(j)]=find(rmax+1);
            lmin=lmax=p[i].l,rmin=rmax=p[i].r;
        }
        else{
            lmin=min(lmin,p[i].l),lmax=max(lmax,p[i].l);
            rmin=min(rmin,p[i].r),rmax=max(rmax,p[i].r);
            if(find(lmax)>rmin) return 0;
        }
    }
    if(find(lmax)>rmin) return 0;
    return 1;
}
int main(){
    freopen("number.in","r",stdin),freopen("number.out","w",stdout);
    read(n),read(T);
    for(int i=1;i<=T;++i) read(e[i].l),read(e[i].r),read(e[i].x);
    int l=1,r=T;
    while(l<r){
        int mid=(l+r+1)>>1;
        if(check(mid)) l=mid;
        else r=mid-1;
    }
    printf("%d\n",l+1);
    return 0;
}

おすすめ

転載: www.cnblogs.com/autoint/p/test20190815.html