sgu Ice-cream Tycoon
2014-08-09 16:00
190 查看
题意:供应商提供n块价格为c的冰淇淋,一个学生想买n块冰淇淋,手中的钱数总共有t元,为了不让买n块冰淇淋所花费的钱数不超过t元,先尽可能卖给这个学生便宜的冰淇淋。
如果这个学生不能买到所需要的冰淇淋则输出“UNHAPPY”,能则输出“HAPPY”。
View Code
如果这个学生不能买到所需要的冰淇淋则输出“UNHAPPY”,能则输出“HAPPY”。
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 200000 using namespace std; long long x[maxn]; struct node1 { char str[100]; int n; long long w; }p[maxn]; struct node { int l,r; long long num; long long sum; int flag; }tree[maxn*4]; void up(int i) { if(tree[i].l==tree[i].r) return ; tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum; tree[i].num=tree[i<<1].num+tree[i<<1|1].num; } void down(int i) { if(tree[i].l==tree[i].r) return ; if(tree[i].flag!=-1) { tree[i<<1].sum=tree[i<<1|1].sum=0; tree[i<<1].num=tree[i<<1|1].num=0; tree[i<<1].flag=tree[i<<1|1].flag=0; tree[i].flag=-1; } } void build(int i,int l,int r) { tree[i].l=l; tree[i].r=r; tree[i].num=tree[i].sum=0; tree[i].flag=-1; if(l==r) return ; int mid=(l+r)>>1; build(i<<1,l,mid); build(i<<1|1,mid+1,r); } void deal(int i,int n,int c) { tree[i].sum+=(long long)c*n; tree[i].num+=n; if(x[tree[i].l]==c&&x[tree[i].r]==c) return ; down(i); if(c<=x[tree[i<<1].r]) deal(i<<1,n,c); else deal(i<<1|1,n,c); } long long search1(int i,int n) { if(tree[i].l==tree[i].r) { return (long long)n*x[tree[i].l]; } down(i); if(tree[i<<1].num>=n) return search1(i<<1,n); else return tree[i<<1].sum+search1(i<<1|1,n-tree[i<<1].num); } void change(int i,int n) { if(tree[i].l==tree[i].r) { tree[i].num-=n; tree[i].sum=tree[i].num*x[tree[i].l]; return ; } down(i); if(tree[i<<1].num>=n) { change(i<<1,n); } else { change(i<<1|1,n-tree[i<<1].num); tree[i<<1].num=0; tree[i<<1].sum=0; tree[i<<1].flag=0; } up(i); } int main() { int cnt=0,t1=0; while(scanf("%s %d%I64d",p[cnt].str,&p[cnt].n,&p[cnt].w)==3) { if(p[cnt].str[0]=='A') { x[t1++]=p[cnt].w; } cnt++; } sort(x,x+t1); t1=unique(x,x+t1)-x; build(1,0,t1-1); for(int i=0; i<cnt; i++) { if(p[i].str[0]=='A') { deal(1,p[i].n,p[i].w); } else { if(tree[1].num<p[i].n) printf("UNHAPPY\n"); else { if(search1(1,p[i].n)>p[i].w) printf("UNHAPPY\n"); else { printf("HAPPY\n"); change(1,p[i].n); } } } } return 0; }
View Code
相关文章推荐
- SGU 311 Ice-cream Tycoon(线段树)
- SGU - 311 Ice-cream Tycoon(线段树)
- SGU - 311 Ice-cream Tycoon(线段树)
- SGU Ice-cream Tycoon 线段树+离散化
- SGU 311. Ice-cream Tycoon(平衡树)
- SGU 311. Ice-cream Tycoon 树状数组
- V - Ice-cream Tycoon(线段树)
- SGU 311. Ice-cream Tycoon(线段树)
- HDU_2122_Ice_cream’sWorldIII
- hdu 2122 Ice_cream’s world III 最小生成树prim
- (OK) Building Ice Cream Sandwich (Android v4) for VirtualBox on EC2
- Problem D. Ice Cream Tower(2016 China-Final)【二分答案+贪心检验】
- Why Ice Cream Sandwich Crashes your App
- HDU-2120 Ice_cream's world I
- TYVJ 1117 拯救ice-cream 解题报告
- Android 4.0 Ice Cream Sandwich源码发布,source code release啦
- 【搜索】拯救ice-cream
- 杭电2121 Ice_cream’s world II(不定根最小树形图)
- HDU 2121 Ice_cream’s world II 最小树形图 模板
- HDU2120Ice_cream's world I(基础并查集)