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. Sql Server 中锁的概念(2)

    1.一般大家都对事务的四种隔离模式比较熟悉,从松到严依次是: - 读取未提交(Read uncommitted):处于此模式下可能会出现脏读.幻象读.不可重复读 - 读取已提交(Read commit ...

  2. install docker-ce for ubuntu

    may need login vpn first docker-ce for ubuntu chinese version docker-ce for ubuntu

  3. Java垃圾回收之新生代垃圾收集器

    问题:什么是Stop-the-World? 1.JVM由于要执行GC而停止了应用程序的执行 2.任何一种GC算法中都会发生 3.多数GC优化通过减少Stop-the-world发生的时间来提高程序的性 ...

  4. 448. Find All Numbers Disappeared in an Array@python

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  5. jquery-closest

    1.closest() 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("click& ...

  6. Ubuntu配置SSH服务器

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专为远 ...

  7. 数据结构( Pyhon 语言描述 ) — — 第4章:数据和链表结构

    数据结构是表示一个集合中包含的数据的一个对象 数组数据结构 数组是一个数据结构 支持按照位置对某一项的随机访问,且这种访问的时间是常数 在创建数组时,给定了用于存储数据的位置的一个数目,并且数组的长度 ...

  8. 大数据学习——mapreduce程序单词统计

    项目结构 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  9. xtu read problem training 3 A - The Child and Homework

    The Child and Homework Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on Code ...

  10. FZU-2147-2147 A-B Game,规律题。。

    Problem 2147 A-B Game Time Limit: 1000 mSec Memory Limit : 32768 KB  Problem Description Fat brother ...