Sgu-311 ice-cream tycoon (line segment tree)

Source: Internet
Author: User

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)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.