スタックとヒープの変種
声明
加速器からの参考教材と教育、から彼を打つのが面倒も分析
削除されたヒープの要素
マークがアイデアを借りて、私たちは主ヒープ維持同じ自然のヒープ(根、細根)各削除を、それは置い内側パイルマークに投げ込まれ
、我々がポップアップする必要がある場合、および場合ヒープ素子の上面とヒープの同じトップの要素を削除、
それは、我々は、この要素が前に持っていた削除、私たちはただ、ヒープやポップ、その後、次の要素を検討しながら、内部ヒープを削除することを示しています。
簡単に時間の複雑さと空間の複雑さがない実質的な変更を見つけることができます。
タイトル
luogu P3545 [POI2012] HUR-倉庫店
私たちが最初に考えがある販売、販売するが、そこに人に直接販売される可能性が高いと十分ではありません残りGG
これを回避するために、我々は入れて、すべての値が販売しているうち各ヒープ、ヒープに投げ込ま先頭の要素と比較した現在の値が、あれば彼よりヒープ要素のトップ、それは彼に他の言葉で、前のものを「離れて排水」されるだろう。
この増加はお答えすることはできませんが、しかし、あなたは、在庫を増やすことができます。子孫は233を冷却先人の木の感があります
対象は、順序に従って言うので、一つだけの構造(しなかったので問題に目を向けるソリューションを怠惰にすることができます
#include<cstdio>
#include<queue>
using namespace std;
#define ll long long
const int MAX = 250000+9;
inline ll read() {
char ch = getchar(); ll f = 1, x = 0;
while(ch<'0' || ch>'9') {if(ch=='-') f = -1; ch = getchar();}
while(ch>='0' && ch<='9') {x = x*10+ch-'0'; ch = getchar();}
return x*f;
}
int n;
ll kucun;
struct time{
ll arr, brr;//这里的arr,在day里面是第i天进货数,在p_q里面是记录的满足了第几天的客人
bool operator < (const time& xxx) const {
return brr < xxx.brr;//大根堆:为了取出前面花费最多的
}
}day[MAX];
priority_queue <time> q;
int main() {
n = read();
for(int i = 1; i <= n; i++) day[i].arr = read();
for(int i = 1; i <= n; i++) day[i].brr = read();
int t = 0;//表示满足了多少人
for(int i = 1; i <= n; i++) {
kucun += day[i].arr;
if(kucun >= day[i].brr) { //能买就买
kucun -= day[i].brr;
t++;
time now; now.arr = i, now.brr = day[i].brr;
q.push(now);
} else {
if(q.size() && q.top().brr > day[i].brr) {//不能买的时候再“退钱回去”
kucun += q.top().brr-day[i].brr;//这波不亏
q.pop();
time now; now.arr = i, now.brr = day[i].brr;
q.push(now);
}
}
}
printf("%d\n", t);
while(!q.empty()) printf("%lld ",q.top().arr), q.pop();//里面装的都是满足了的
printf("\n");
}