[Л Гу P4602] CTSC2018 смешанный фруктовый сок

Описание проблемы

R стремится делать небольшие темные блюда, особенно смешанный фруктовый сок. Магазин имел п фруктовых соков, пронумерованные 0, 1, 2 ,, п -... 1. Я количество вкусного сока ди, за литр цены пи. Малый R в производстве смешанного фруктового сока, есть некоторые специальные положения, а именно смешанные в бутылке сока, я могу только сложить числа Li литров сока. Сейчас есть м ищет маленьких детей приходят R смешанный фруктовый сок пить, они все хотят, чтобы сделать немного R магазин сок, смешанный в бутылку сока. В котором J-го его детей желательно смешивать сок, полученный не больше, чем общая стоимость ГДж, объем не менее Lj. В соответствии с этими ограничениями, дети также хотят вкусные блюда фруктового сока, как можно выше, бутылка вкусного смешанного фруктового сока равно минимального значение всех участвующего сока смешанных вкусных градусов. Рассчитайте самый вкусный вкус фруктового сока смешанного напитка каждого ребенка.

Формат ввода

Чтение данных из файлов juice.in в.

Ввод в первой строке содержит два положительных целых чисел п, т, представляет собой количество детей и количество видов фруктовых соков.

Далее п строк, в каждой строке три положительные целые числа ди, пи, Li, я представляет восхитительность из фруктового сока числа DI, цена на литр пи, добавив верхний предел в бутылке сока составляет от Li.

Далее м линия последовательно описывает все ребенок: два в каждой строке ГДж числе положительных целых чисел, Lj описывают ребенок, сказал, что он заплатил до ГДжа долларов, он хочет, по крайней мере, Lj литров сока.

Формат вывода

Juice.out вывода в файл.

Последовательная выход для всех детей: Для каждого ребенка, выход на одну строке, содержащей целое число, представляющее самый вкусный микс вкусного сока пить его степень. Если вы не можете удовлетворить свои потребности, то выход -1.

ввод пробы

3 4
1 3 5
2 1 3
3 2 5
6 3
5 3
10 10
20 10

Пример вывода

3
2
-1
1

объяснение

Для всех тестовых данных, чтобы гарантировать, что N, M ≤ 100000,1 ≤ ди, PI, Li ≤ 10 ^ 5,1 ≤ Gj, Lj ≤ 10 ^ 18.

Решимость

По игровому столу и ряд метафизики способов найти ответы монотонных. Половина d, то мы можем выбрать только больше чем или равный d сок. Затем устанавливаются для всех г больше или равна цене сока целевого веса для следующего сегмента дерева, каждый узел также сохранен об общем объеме и цене. Таким образом, мы можем использовать значение дерева линии в правой половине Лим.

Но не раз достижение каждой половины. Мы можем построить Председатель дерева можно использовать настойчивость, чтобы решить эту проблему.

код

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
#define N 100002
#define T 100000
using namespace std;
struct ChairmanTree{
    int l,r,suml,sump;
}t[N*40];
struct juice{
    int d,p,l;
}a[N];
int n,m,i,g[N],L[N],root[N],p;
int read()
{
    char c=getchar();
    int w=0;
    while(c<'0'||c>'9') c=getchar();
    while(c<='9'&&c>='0'){
        w=w*10+c-'0';
        c=getchar();
    }
    return w;
}
int my_comp(const juice &x,const juice &y)
{
    return x.d<y.d;
}
int insert(int pre,int l,int r,int L,int P)
{
    p++;
    int num=p;
    t[p]=t[pre];
    t[p].suml+=L;t[p].sump+=L*P;
    if(l<r){
        int mid=(l+r)/2;
        if(P<=mid) t[p].l=insert(t[pre].l,l,mid,L,P);
        else t[p].r=insert(t[pre].r,mid+1,r,L,P);
    }
    return num;
}
int ask(int p,int l,int r,int L)
{
    if(l==r) return l*L;
    int mid=(l+r)/2;
    if(L<=t[t[p].l].suml) return ask(t[p].l,l,mid,L);
    return t[t[p].l].sump+ask(t[p].r,mid+1,r,L-t[t[p].l].suml);
}
signed main()
{
    n=read();m=read();
    for(i=1;i<=n;i++) a[i].d=read(),a[i].p=read(),a[i].l=read();
    for(i=1;i<=m;i++) g[i]=read(),L[i]=read();
    a[0].d=-1;
    sort(a+1,a+n+1,my_comp);
    for(i=n;i>=1;i--) root[i]=insert(root[i+1],1,T,a[i].l,a[i].p);
    for(i=1;i<=m;i++){
        int l=1,r=T,mid,ans=0;
        while(l<=r){
            mid=(l+r)/2;
            if(L[i]<=t[root[mid]].suml&&ask(root[mid],1,T,L[i])<=g[i]){
                ans=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        printf("%lld\n",a[ans].d);
    }
    return 0;
}

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

отwww.cnblogs.com/LSlzf/p/11878957.html
рекомендация