luogu3826 [NOI2017] овощи

[NOI2017] овощи

Бог не писать слишком

Взгляд из потока сети (поток затрат), Х рот конструктивной схемы (не верит, не практикует): это с даже стороны выразили каждый день узла , чтобы представлять, продавать то , что продукты питания, за текущие и овощи, точку источника к этому день и даже овощи не совсем плохая сторона, емкость количество овощей на этом ухудшении дня по цене \ (a_i \) , особенно для \ (s_i \) , мы в последний день сноса отдельной одной стороны, скорость потока 1, Стоимость \ (a_i + s_i \) , в то же время каждый день в предыдущий день даже емкость \ (INF \) , стоимость \ (0 \) боковой, представляют собой последний в этот день должны быть проданы овощи могут продается на фронте, в конце каждого дня , даже тонуть емкость \ (т \) , стоимость \ (0 \) стороне, так что должно быть в наличии \ (56-60pts \)

Так как оптимизировать это? Мы можем смоделировать этот поток стоимости процесса. Отмечая такое важное свойство: передний \ (я-1 \) день продают некоторые овощи перед \ (I \) дней подмножеством продают овощи, поэтому стоимость в вышеуказанном потоке с помощью \ ( S \) даже из той части обратного потока операции не произойдет, поэтому мы можем использовать кучу , чтобы поддерживать текущее значение каждого вида овощей, каждый взяты из одного из самых больших элементов , чтобы увидеть , если он может быть в правовом был продан за несколько дней до этого , это может быть установлено , чтобы проверить и сохранить кучу +

Таким образом, он закончил QAQ, это моделирование потока затрат довольно хорошо написано, ключевой момент, чтобы отметить, что обратный поток не будет происходить

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<math.h>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define int long long
typedef long long ll;
typedef long double db;
const int N=100000;
const db pi=acos(-1.0);
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define fir first
#define sec second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define maxd 998244353
#define eps 1e-8

struct node{
    int val,id;
};
bool operator <(node p,node q) {return p.val<q.val;}
priority_queue<node> q;
struct vegetable{
    int a,c,x,s;
}a[100100];
int n,m,qcnt,fa[100100],cnt[100100];
ll ans[100100];

int read()
{
    int x=0,f=1;char ch=getchar();
    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 find(int x)
{
    if (fa[x]==x) return fa[x];
    fa[x]=find(fa[x]);
    return fa[x];
}

signed main()
{
    n=read();m=read();qcnt=read();
    rep(i,1,n)
    {
        a[i].a=read();a[i].s=read();a[i].c=read();a[i].x=read();
        if (a[i].c) q.push((node){a[i].s+a[i].a,i});
    }
    rep(i,1,N) fa[i]=i;
    ll sum=0;
    rep(i,1,N)
    {
        int j;
        for (j=1;j<=m && !q.empty();j++)
        {
            node now=q.top();q.pop();
            int lat;
            if (!a[now.id].x) lat=N;
            else lat=min(N,(a[now.id].c-1)/a[now.id].x+1);
            int pos=find(lat);
            //cout << pos << " " << lat << endl;
            if (!pos) {j--;continue;}cnt[pos]++;
            if (cnt[pos]==m) fa[pos]=find(pos-1);
            sum+=now.val;a[now.id].c--;
            if (a[now.id].c) q.push((node){a[now.id].a,now.id});
        }
        //cout << endl;
        ans[i]=sum;
    }
    while (qcnt--) printf("%lld\n",ans[read()]);
    return 0;
}

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

отwww.cnblogs.com/encodetalker/p/11141341.html