Стек и куча вариантов

Стек и куча вариантов

заявление

Справочник курсы и обучение из ускорителя , анализ также слишком ленив , чтобы ударить его из

Heap элементы удалены

Марк заимствовать идеи, и мы поддерживаем первичную кучу же природу кучу (корень, корешки) от каждого удаления положить его бросили в отметку сваи внутри
, когда мы должны трещать, и если в верхней части элемента кучи и удалять элементы одного и те же верхнюю частью кучи ,
то это показывает , что мы уберем этот элемент был представлен, так что мы просто удалить кучу и кучу внутри в то время как поп, затем изучить следующий элемент.
Легко найти временную сложность и сложность пространства каких - либо существенных изменений.

титульный

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");
}

рекомендация

отwww.cnblogs.com/tyner/p/11443008.html