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. 项目中常用的js方法(持续更新)

    <script> var utils = { //时间戳转日期(timestamp:时间戳 默认当前时间) dateFormat: function(timestamp = new Dat ...

  2. css内容补充之其它

    1.overflow 当图片大小,超出div的大小时,可以指定overflow值为auto(带滚动条).hidden(隐藏,只显示一块): hover 当鼠标移动到当前标签上时,以下css属性才生效:

  3. MATLAB读取每个文件夹下的badcsv文件后合并为总的badexcel文件

    clear; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%读取子文件夹中bad.csv数据%并把所有数据写到一个excel文件中%%%%%%%%%%%%%%%%%% ...

  4. 苹果平台上的媒体流播放技术HLS

    近日在和朋友聊起媒体流的服务器端实时转码技术的时候,发现苹果的各种终端上的视频播放并未使用常见的基于UDP的RTSP/RTP,而强制使用了Http Live Stream技术,这里稍稍总结了如下. 苹 ...

  5. 复制webp图片到word || 微信webp图片不能复制 || 如何复制webp到word

    用IE浏览器打开Alt+A 复制直接去word粘贴, 用IE浏览器打开Alt+A 复制直接去word粘贴 用IE浏览器打开Alt+A 复制直接去word粘贴 用IE浏览器打开Alt+A 复制直接去wo ...

  6. 条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)

    NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一 ...

  7. Haproxy配置文件详解

    #/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -st `cat /var/run/haproxy.pid` ################ ...

  8. luogu2894 [USACO08FEB]酒店Hotel

    跟线段树求区间最值一样每个节点维护左边开始的最大连续空房间数.右边开始的最大连续空房间数.这个区间内的最大连续空房间数 #include <iostream> #include <c ...

  9. 记第一次开发安卓应用——IT之家RSS阅读器

    这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...

  10. iframe in ipad safari

    http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebconten ...