您的位置:首页 > 其它

sgu Ice-cream Tycoon

2014-08-09 16:00 190 查看
题意:供应商提供n块价格为c的冰淇淋,一个学生想买n块冰淇淋,手中的钱数总共有t元,为了不让买n块冰淇淋所花费的钱数不超过t元,先尽可能卖给这个学生便宜的冰淇淋。

如果这个学生不能买到所需要的冰淇淋则输出“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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: