SGU - 311 Ice-cream Tycoon(线段树)
来源:互联网 发布:php 输出html代码 编辑:程序博客网 时间:2024/06/18 10:17
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
HAPPYif she gets her ice-cream, and
UNHAPPYif 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 ncor
BUY nt, 1 ≤ n, c ≤ 10 6, 1 ≤ t ≤ 10 12.
Output
For each
BUY-query output one line, containing either the word
HAPPYor the word
UNHAPPY(answers should 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
题意:一个商店,有两种操作:(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;}
1 0
- SGU - 311 Ice-cream Tycoon(线段树)
- SGU Ice-cream Tycoon 线段树+离散化
- Ice-cream Tycoon SGU
- V - Ice-cream Tycoon(线段树)
- SGU 311. Ice-cream Tycoon(平衡树)
- SGU 311. Ice-cream Tycoon 树状数组
- Icy ice cream delivery
- 拯救ice-cream
- 【搜索】拯救ice-cream
- A. Free Ice Cream
- Free Ice Cream
- Gym101194D-Ice Cream Tower
- Ice Cream Sandwich系虾米?
- Ice Cream Sandwich编译指令。
- P1117 拯救ice-cream tyvj
- CodeForces 686AFree Ice Cream
- SGU 128 Snake(线段树)
- SGU Inversions(线段树)
- MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStart
- 微观SOA:服务设计原则及其实践方式
- 别样JAVA学习(八)String上
- hibernate官方入门教程 (转载)
- Cocos2d-x_CCControlSlider(滑动条类)介绍
- SGU - 311 Ice-cream Tycoon(线段树)
- Oracle Form开发手电筒查找功能实现
- 找出10000以内的完美数
- 别样JAVA学习(八)String下
- 如何推广你的产品,即你的APP
- 啊哈算法 之 冒泡排序
- 再谈multistage text input(中文输入法)下UITextView的内容长度限制
- 该做什么?
- 七星彩票选号