Description





You've recently started an ice-cream business in a local school. During a day you have many suppliers delivering the ice-cream for you, and many 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 n pieces of ice-cream priced c each to you, or

BUY nt

, meaning that a student wants to buy n pieces of ice-cream, having a total of t money. The latter is processed as follows: in case n cheapest pieces of ice-cream you have cost no more than t (together), you sell those n cheapest
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 (inclusive), each on a separate line. The queries are formatted as described above, either

ARRIVE nc

or

BUY nt

, 1 ≤ nc ≤ 10 6, 1 ≤ t ≤ 10 12.

Output

For each

BUY

-query output one line, containing either the word

HAPPY

or the word

UNHAPPY

(answers should be in the same order as the corresponding queries).

Sample Input

sample input
sample output
ARRIVE 1 1
ARRIVE 10 200
BUY 5 900
BUY 5 900
BUY 5 1000
HAPPY
UNHAPPY
HAPPY

题意:一个商店,有两种操作:(1)ARRIVE n c表示进货n个,每一个c元。(2)BUY n t表示一个买货的人要买n个,一共拿了t元钱。假设如今店里的货的数量大于等于n且最廉价的n个的价格小于等于t则将最廉价的卖给他。否则不卖。

思路:离线的线段树,我们以价格作为结点,然后离散化,好久没做。看了final爷kuangbing的题解,注意的是优先处理最小的n个

#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(线段树)的更多相关文章

  1. SGU 531. Bonnie and Clyde 线段树

    531. Bonnie and Clyde 题目连接: http://acm.sgu.ru/problem.php?contest=0&problem=531 Description Bonn ...

  2. SGU 319 Kalevich Strikes Back(线段树扫描线)

    题目大意: n个矩形,将一个大矩形分成 n+1 块.矩形之间不重合,可是包括.求这n+1个矩形的面积 思路分析: 用线段树记录他们之间的父子关系.然后dfs 计算面积. 当给出的矩形上边的时候,就要记 ...

  3. Sonya and Ice Cream CodeForces - 1004E 树的直径, 贪心

    题目链接 set维护最小值贪心, 刚开始用树的直径+单调队列没调出来... #include <iostream>#include <cstdio> #include < ...

  4. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  5. bzoj3252攻略(线段树+dfs序)

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 562  Solved: 238[Submit][Status][Discuss] D ...

  6. SGU 311. Ice-cream Tycoon(线段树)

    311. Ice-cream Tycoon Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: standar ...

  7. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  8. SGU 319. Kalevich Strikes Back (线段树)

    319. Kalevich Strikes Back Time limit per test: 0.5 second(s)Memory limit: 65536 kilobytes input: st ...

  9. bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...

随机推荐

  1. Hibernate-02 HQL实用技术

    学习任务 Query接口的使用 HQL基本用法 动态参数绑定查询 HQL的使用 Hibernate支持三种查询方式:HQL查询.Criateria查询.Native SQL查询. HQL是Hibern ...

  2. luogu 1113 杂务--啥?最长路?抱歉,我不会

    P1113 杂务 题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务 ...

  3. [POJ] 1191 [LUOGU] P1436 棋盘分割

    那个均方差,可以通过展开.合并Σ,发现最终只有Xi^2会对答案造成影响,其他都是定值,所以求出最小的和的平方就行. 其实这才是这题最难的部分,以下都是码农部分. f[x1][y1][x2][y2][k ...

  4. $config['base_url'] BASE_URL

    /*|------------------------------------------------| Base Site URL|--------------------------------- ...

  5. 大数据学习——hdfs客户端流式操作代码的实现

    package cn.itcast.bigdata.hdfs.diceng; import org.apache.hadoop.conf.Configuration; import org.apach ...

  6. Laya 类列表加载优化

    Laya 类列表加载优化 @author ixenos 类列表:在一个页面展示的大量的零散单元的集合(聊天面板.背包) 一.按展示优化1.展示内容少,即使大量数据,但用户只看到少量信息的时候,考虑按需 ...

  7. linux shell symbolic link & soft link, symbol link, link

    linux shell symbolic link symbolic link https://en.wikipedia.org/wiki/Ln_(Unix) https://stackoverflo ...

  8. hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)

    #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire ...

  9. CCF 201712-4 90分

    90分,不知道错在哪里了,dijkstra算法,用一个数组的d[i]表示以i点结尾的小路的长度,以i点为中心扩展时,若下一点为k,如果i->k是小路,则 d[j] = d[k]+M[k][j]; ...

  10. 调用BOS服务保存一个单据的简化示例

    IMetaDataService metadataService = ServiceHelper.GetService<IMetaDataService>(); // 加载元数据 Form ...