問題の谷局送信機のP1901へロス・ソリューション

P1901の送信局

タイトル説明

どこかの列に配置されたN個のエネルギー放出ステーションがあり、各送信局iはハイと同じ高さを有していない、及びエネルギー値Viにはエネルギーを伝達しながら辺(側のみにコースの端部)に出射しますエネルギーはごく最近であり、送信局の両側に、その受信よりも高いです。

明らかに、送信局によって送信されたエネルギーのそれぞれは、安全のために、特に、0または1または2の他の送信局によって受け入れられる可能性がある、それぞれのエネルギーの合計は、ステーションは、我々が懸念しているものである送信ました。大量のデータなので、あなたが今だけエネルギーの送信局は、エネルギーがある受信計算を支援するために、最大受信する必要があります。

入力形式

行1:整数N。

N + 1行の2:I + 1行二つの整数HIおよびViは、私は非常に個人的な送信局と送信エネルギー値を表します。

出力フォーマット

唯一の出力ラインは、答えは倍長以下であり、受け取った送信局のほとんどのエネルギー値のエネルギーが受信される表しています。

サンプル入力と出力

入力#1

3
4 2
3 5
6 10

出力#1

7

説明/ヒント

データの40%、1 <= N <= 5000; 1 <=こんにちは<= 100000; 1 <= Viと<= 10000。

データの70%、1 <= N <= 100000; 1 <=こんにちは<= 2,000,000,000; 1 <= Viと<= 10000。

1 <=こんにちは<= 2,000,000,000; 1 <= Viと<= 10000データの100%、1 <= N <= 1000000です。

[思考]

単調サブタイトルをパレット
(信号エネルギーが平均を下回っている、送信された信号は、発光エネルギーより面白い感じ前記)

[タイトル]効果

シグナルタワーの多くの
信号を送信することができるタワー
彼は信号を受信することができるよりも、最初の列の両側にのみ送信された信号を

なぜモノトーン[スタック]を使用します

単調なスタックは、第一の位置の両側上の点を見つけるために使用された時点よりも小さいか大きい
。このことは、明らかに右である
あなたがその中にいるので、この数およびスタックの先頭を比較する
(現在はこの点を超える最初の両側を見つけると仮定
し、 )対象要件のように
番号がスタックの最上部よりも大きい場合
、最初のスタックの権利が投票された数は、彼の右にあるよりも大きいことは明らかであり
、その後の数がスタックの最上部よりも小さい場合
には、この番号は最初の番号で残っていることは明らかである以上である彼も見つけますバーがある
位置の数よりも多い/より少ない求めのスタックの両側で使用できるように単調

[最終]アイデア

単調な側面は、この数が第一の位置よりも大きい見つけるスタック
スタック単調単調なプロセスにおける
数よりも大きい場合、上記スタック前記
位置信号と、このコラムから受信すると、スタックによって放射された信号を加算することが可能であることができます
この数は、スタックの最上部よりも小さい場合
、この位置は、スタックの先頭が受信場所シグナルタワーがあったことを送信することができるシグナルタワー
スタックの頂部が受信可能な信号タワー
この数プラス塔問題ができるオンを信号強度
最後に列挙するためには、一度電柱信号を受信
okojの最大値に比較出力を

[完了コード】

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
const int Max = 1000006;
struct node
{
    int hao;
    int h;
    int v;
    int w;
}a[Max];
stack<int>s;
int main()
{
    int n;
    cin >> n;
    for(register int i = 1;i <= n;++ i)
        cin >> a[i].h >> a[i].v,a[i].hao = i;
    for(register int i = 1;i <= n;++ i)
    {
        while(!s.empty() && a[s.top()].h < a[i].h)
        {
            a[i].w += a[s.top()].v;
            s.pop();
        }
        if(!s.empty())
        a[s.top()].w += a[i].v;
        s.push(i);
    }
    int M = 0;
    for(register int i = 1;i <= n;++ i)
        M = max(M,a[i].w);
    cout << M << endl;
    return 0; 
}

おすすめ

転載: www.cnblogs.com/acioi/p/11681307.html