WWWWWW不謹慎なブログについての宣伝
記事一覧-核融合炉のコア-羅Guboオフ
スタックの高さに応じて降順に信号列
新しいシグナルタワーの場合:
示されるように、彼がスタックに加えられたとき、
それは、塔の伝播よりも低くなるまでブロックされ
、それはシグナルタワーを受信するよりも低いも希望- だから、それはすべての塔が削除スタックの最上部よりも低くないだろう
(彼らはもはや他のタワー信号に広がる可能性があるため)
、同時に、新タワーはエネルギーを受け
、プラスのエネルギーのタワー伝達を削除しました
- だから、それはすべての塔が削除スタックの最上部よりも低くないだろう
示されるように、その高い塔の元の高さの比、
最も近いこの新しい信号塔からは、新たなシグナルタワーを受信します- したがって、このときスタックの塔頂に
すなわち、新しい最新のカラムからの信号と、そのよりコラムの高さより高い
受信エネルギー、
新しい列を伝播するエネルギーと結合
- したがって、このときスタックの塔頂に
この新しいシグナルタワーと、スタックの上に
\(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]);
}