P1901発光問題解決[ステーション]

WWWWWW不謹慎なブログについての宣伝
記事一覧-核融合炉のコア-羅Guboオフ


スタックの高さに応じて降順に信号列

新しいシグナルタワーの場合:

1

  • 示されるように、彼がスタックに加えられたとき、
    それは、塔の伝播よりも低くなるまでブロックされ
    、それはシグナルタワーを受信するよりも低いも希望

    • だから、それはすべての塔が削除スタックの最上部よりも低くないだろう
      (彼らはもはや他のタワー信号に広がる可能性があるため)
      、同時に、新タワーはエネルギーを受け
      、プラスのエネルギーのタワー伝達を削除しました

2

  • 示されるように、その高い塔の元の高さの比、
    最も近いこの新しい信号塔からは、新たなシグナルタワーを受信します

    • したがって、このときスタックの塔頂に
      すなわち、新しい最新のカラムからの信号と、そのよりコラムの高さより高い
      受信エネルギー、
      新しい列を伝播するエネルギーと結合
  • この新しいシグナルタワーと、スタックの上に

\(O(N)\)複雑にわたって掃引後に、すべてでカラムを注文エネルギーを受け
最大値に出力

アタッチ 醜いです コード:

#include<cstdio>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const int MARX = 1e6+10;
ll n;
ll h[MARX],v[MARX],w[MARX];
stack <int> s;
signed main()
{
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++)
      {
        scanf("%lld%lld",&h[i],&v[i]); 
        while(!s.empty())// 将栈顶所有比它低的塔删除,
          {
            if(h[s.top()]>h[i]) break;//遇到比新塔高的 
            w[i]+=v[s.top()];// 加上 删掉的塔传播的能量 
            s.pop();
          }
        if(!s.empty()) w[s.top()]+=v[i];//加上新的塔传播的能量  
        s.push(i);//加入栈 
      }
    sort(w+1,w+n+1);//找到最大值 
    printf("%lld",w[n]);
}

おすすめ

転載: www.cnblogs.com/luckyblock/p/11456380.html