CSP-トレーニングWeek5問題Bモノトーンキューの問題(POJ - 2823)

モノトーンキュー問題Week5問題B

アーキテクチャの概要

キュー、共通のデータ構造は、彼がキューデータ構造に私たちの日常生活をシミュレートし、キューにある現実の生活の特性があります。最初の最初のキューを入力し、来る、キューは前のサービスを受け入れることができます。そして、一般的に、基本的なデータ構造として使用され、C ++ STLライブラリもパッケージ化キュー構造を提供し、キューの次のステートメントのパッケージタイプを使用して行うことができます

#include<queue>

:STLキューを照会することができる方法をC ++の公式文書の学習に関する情報C ++の公式文書は
-モノトーンのデータ構造、および地域別の値の範囲内の最大最小値検索を解決するためにそれを使用するタイトルにキュー拡張データ構造を使用しています比較の問題。

トピックの概要

トピック物語

ZJMは、それぞれ、最大値と最小値毎に列数と窓kのサイズNの長さを有し、ウィンドウは列に前後に移動させることができる。ZJMは現在スライディングウィンドウ内で左から右に知りたい、窓何例:
列の数は、kは3に等しく、[13-1-35367]、です。

ウィンドウの状態 最小&最大
[1 3 -1] -3- 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5] 3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7

INPUT&SAMPLE INPUT

2行を入力します。二つの整数nとkの最初の行はサイズおよびスライディングウィンドウシリーズ、1 <= K <= Nの長さ <= 1000000。第二行は、n ZJMの列の整数を表しています。
サンプル入力:

8 3
1 3 -1 -3 5 3 6 7

OUTPUT&サンプル出力

出力の2行があります。左から右へ、各スライディングウィンドウ位置の第1の出力ライン、スライディングウィンドウ内の最小値。2行目は最大です。
出力例:

-1 -3 -3 -3 3 3
3 3 5 6 7

トピック修正再表示およびピット

問題は、次の要件を概説したように略記されることが意図:指定されたサイズの数列、及び窓、後進ステップ= 1の速度にウィンドウ、ウィンドウ内の各ウィンドウの状態の最大値を計算し、そして最小。

問題解決のためのアイデア

あなたはおなじみのモノトーンキューされている場合は、この質問が質問の明確な意味で見つけるべきである彼は、次のいくつかのキーワードがあるので、簡単な質問単調ボードキューです:
、シーケンスの1の値、および順次アクセスを。
2、最大値、部分領域(ウィンドウ)の範囲の最小値を検索するための
直接のサイズを比較するための比較的簡単なプロセスであると、データ3

なぜモノトーンのキューを使用します。

挿入することで、単調に(減少)増加するシーケンスを維持する:私たちは似た単調なスタック・ソリューションを使用することができ、最大(最小)値を見つける&ウィンドウのサイズを維持し、単調な動作:問題の主な要件が二つあることに疑問のショーの全体の意味ポップアップ秩序価値を維持するための方法を、具体的な内容を見ることができます:単調なスタック内容が詳細
が、別の要件は、我々は既存のデータ構造を満たすことができないということです。同じ大きさの窓を保管してください。

モノトーンの具体的な操作キュー

したがって、我々は(退屈と頭部、尾部から操作することができる)単調キューを導入する
、請求項1のソリューションで:維持単調に、我々は、キューが維持維持できる、キューの末尾を超える動きを維持することに単調スタックを維持することができます単調
項2溶液:ウィンドウを超えていないキューに格納された値を維持するには、下付きキュー、キュー内の各要素の実際のストレージアレイの添字を、本較正するために使用することができます
新しく挿入された要素の添字のテール - キュー要素インデックスのヘッド>ウィンドウサイズ=
モバイル証明窓の後、キュー要素のヘッドは現在のウィンドウに属していない、あなたは開くことができます。
単調な練習を維持することによってキューとして、私たちは現在のウィンドウのチームの最初のキューが最大(最小)(ウィンドウサイズに合わせて)常に正当であることを保証することができ、問題が解決されます。

概要

単調なキュー・ボードの問題が、よくこの質問で単調なキュー中心的な考えを学ばなければならない場合があります
、1尾は単調性維持
2を、頭部探索エリアの大きさを維持するために
単調なモノトーンのキューを、しばしば混在トピックを積み重ね、それらが解決されます数値シーケンスのグローバル検索問題に対する局所探索は、コントラストを使用することが理解されよう。

元のタイトル

#include<iostream>
#include<cstdio>
using namespace std;
int q[1000010];
int a[1000010];
int max_num[1000010];
int min_num[1000010];
int number=0;
int win=0;
void make_max()//维持递减数列
{
    int L=1;
    int R=0;
    for(int i=1;i<=number;i++)
    {
        while(R>=L && a[q[R]]<=a[i])
        {R--;}
        q[++R]=i;
        if(q[R]-q[L]>win-1)
        L++;
        max_num[i]=q[L];
    }
}
void make_min()//维持递增数列数列
{
    int L=1;
    int R=0;
    for(int i=1;i<=number;i++)
    {
        while(R>=L && a[q[R]]>=a[i])
        {R--;}
        q[++R]=i;
        if(q[R]-q[L]>win-1)
        L++;
        min_num[i]=q[L];
    }
}
int main()
{
    scanf("%d %d",&number,&win);
    for(int i=1;i<=number;i++)
    {
        scanf("%d",&a[i]);
    }
    make_max();
    make_min();
    for(int i=win;i<=number;i++)
    {
        printf("%d ",a[min_num[i]]);
    }
    printf("\n");
    for(int i=win;i<=number;i++)
    {
        printf("%d ",a[max_num[i]]);
    }
    printf("\n");
    
    return 0;
}
公開された17元の記事 ウォンの賞賛2 ビュー1656

おすすめ

転載: blog.csdn.net/qq_43942251/article/details/105160021