Description
You 've recently started an ice-cream business in a local school. during a day you have your suppliers delivering the ice-cream for you, and your students buying it from you. you are not allowed to set the prices, as you are told the price for each piece of ice-cream by the suppliers.
The day is described with a sequence of queries. Each query can be either
ARRIVE nc
, Meaning that a supplier has delivered
NPieces of ice-cream priced
CEach to you, or
BUY nt
, Meaning that a student wants to buy
NPieces of ice-cream, having a total
TMoney. The latter is processed as follows: In case
NCheapest pieces of ice-cream you have cost no more
T(Together), you must those
NCheapest pieces to the student; in case they cost more, she gets nothing. You start the day with no ice-cream.
For each student, output
HAPPY
If she gets her ice-cream, and
UNHAPPY
If she doesn' t.
Input
The input file contains between 1 and 10 5 queries (sparse SIVE), each on a separate line. The queries are formatted as described above, either
ARRIVE nc
Or
BUY nt
, 1 ≤
N,
C≤ 10 6, 1 ≤
T≤ 10 12.
Output
For each
BUY
-Query output one line, containing either the word
HAPPY
Or the word
UNHAPPY
(Answers shocould be in the same order as the corresponding queries ).
Sample Input
sample input |
sample output |
ARRIVE 1 1ARRIVE 10 200BUY 5 900BUY 5 900BUY 5 1000 |
HAPPYUNHAPPYHAPPY
|
There are two operations for a store: (1) arrive n C indicates that N items are purchased, each of which is c RMB. (2) Buy n t indicates that a buyer needs to buy n items, and a total of T yuan is spent. If the number of goods in the store is greater than or equal to N and the price of the cheapest N is less than or equal to T, sell the cheapest to him. Otherwise, it will not be sold.
Idea: For offline line segment trees, we take the price as the node, and then discretize it. We haven't done it for a long time. After reading the final kuangbing question, note that we have given priority to the N smallest parts.
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <queue>#define lson(x) (x<<1)#define rson(x) ((x<<1)|1)typedef long long ll;using namespace std;const int maxn = 100010;struct Node {int l, r;ll num;ll sum;int flag;} segTree[maxn<<2];int x[maxn];void pushdown(int x) {if (segTree[x].l == segTree[x].r) return;if (segTree[x].flag != -1) {segTree[lson(x)].sum = segTree[rson(x)].sum = 0;segTree[lson(x)].num = segTree[rson(x)].num = 0;segTree[lson(x)].flag = segTree[rson(x)].flag = 0;segTree[x].flag = -1;}}void pushup(int x) {if (segTree[x].l == segTree[x].r) return;segTree[x].sum = segTree[lson(x)].sum + segTree[rson(x)].sum;segTree[x].num = segTree[lson(x)].num + segTree[rson(x)].num;}void build(int x, int l, int r) {segTree[x].r = r;segTree[x].l = l;segTree[x].sum = segTree[x].num = 0;segTree[x].flag = -1;if (l == r) return;int mid = l + r >> 1;build(lson(x), l, mid);build(rson(x), mid+1, r);}void Add(int i, int c, int n) {segTree[i].sum += (ll) c * n;segTree[i].num += n;if (x[segTree[i].l] == c && x[segTree[i].r] == c)return;pushdown(i);if (c <= x[segTree[lson(i)].r]) Add(lson(i), c, n);else Add(rson(i), c, n);}ll query(int i, int n) {if (segTree[i].l == segTree[i].r) {return (ll) n * x[segTree[i].l];}pushdown(i);if (segTree[lson(i)].num >= n) return query(lson(i), n);else return segTree[lson(i)].sum + query(rson(i), n-segTree[lson(i)].num);}void clear(int i, int n) {if (segTree[i].l == segTree[i].r) {segTree[i].num -= n;segTree[i].sum = segTree[i].num * x[segTree[i].l];return;}pushdown(i);if (segTree[lson(i)].num >= n)clear(lson(i), n);else {clear(rson(i), n-segTree[lson(i)].num);segTree[lson(i)].num = segTree[lson(i)].sum = 0;segTree[lson(i)].flag = 0;}pushup(i);}struct Query {char op[10];int n;ll c;} q[maxn];int main() {int n = 0;int tot = 0;while (scanf("%s%d%lld", q[n].op, &q[n].n, &q[n].c) != EOF) {if (q[n].op[0] == 'A')x[tot++] = q[n].c;n++;}sort(x, x+tot);tot = unique(x, x+tot) - x;build(1, 0, tot-1);for (int i = 0; i < n; i++) {if (q[i].op[0] == 'A')Add(1, q[i].c, q[i].n);else {if (segTree[1].num < q[i].n) printf("UNHAPPY\n");else {if (query(1, q[i].n) > q[i].c)printf("UNHAPPY\n");else {printf("HAPPY\n");clear(1, q[i].n);}}}}return 0;}
Sgu-311 ice-cream tycoon (line segment tree)