sgu Ice-cream Tycoon

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

如果这个学生不能买到所需要的冰淇淋则输出“UNHAPPY”,能则输出“HAPPY”。

  1 #include <cstdio>

  2 #include <cstring>

  3 #include <algorithm>

  4 #define maxn 200000

  5 using namespace std;

  6 

  7 long long x[maxn];

  8 struct node1

  9 {

 10     char str[100];

 11     int n;

 12     long long w;

 13 }p[maxn];

 14 struct node

 15 {

 16     int l,r;

 17     long long num;

 18     long long sum;

 19     int flag;

 20 }tree[maxn*4];

 21 

 22 void up(int i)

 23 {

 24     if(tree[i].l==tree[i].r) return ;

 25     tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;

 26     tree[i].num=tree[i<<1].num+tree[i<<1|1].num;

 27 }

 28 void down(int i)

 29 {

 30     if(tree[i].l==tree[i].r) return ;

 31     if(tree[i].flag!=-1)

 32     {

 33         tree[i<<1].sum=tree[i<<1|1].sum=0;

 34         tree[i<<1].num=tree[i<<1|1].num=0;

 35         tree[i<<1].flag=tree[i<<1|1].flag=0;

 36         tree[i].flag=-1;

 37     }

 38 }

 39 

 40 void build(int i,int l,int r)

 41 {

 42     tree[i].l=l; tree[i].r=r;

 43     tree[i].num=tree[i].sum=0;

 44     tree[i].flag=-1;

 45     if(l==r) return ;

 46     int mid=(l+r)>>1;

 47     build(i<<1,l,mid);

 48     build(i<<1|1,mid+1,r);

 49 }

 50 

 51 void deal(int i,int n,int c)

 52 {

 53     tree[i].sum+=(long long)c*n;

 54     tree[i].num+=n;

 55     if(x[tree[i].l]==c&&x[tree[i].r]==c) return ;

 56     down(i);

 57     if(c<=x[tree[i<<1].r]) deal(i<<1,n,c);

 58     else deal(i<<1|1,n,c);

 59 }

 60 

 61 long long search1(int i,int n)

 62 {

 63     if(tree[i].l==tree[i].r)

 64     {

 65         return (long long)n*x[tree[i].l];

 66     }

 67     down(i);

 68     if(tree[i<<1].num>=n)  return search1(i<<1,n);

 69     else

 70         return tree[i<<1].sum+search1(i<<1|1,n-tree[i<<1].num);

 71 }

 72 

 73 void change(int i,int n)

 74 {

 75     if(tree[i].l==tree[i].r)

 76     {

 77         tree[i].num-=n;

 78         tree[i].sum=tree[i].num*x[tree[i].l];

 79         return ;

 80     }

 81     down(i);

 82     if(tree[i<<1].num>=n)

 83     {

 84         change(i<<1,n);

 85     }

 86     else

 87     {

 88         change(i<<1|1,n-tree[i<<1].num);

 89         tree[i<<1].num=0;

 90         tree[i<<1].sum=0;

 91         tree[i<<1].flag=0;

 92     }

 93     up(i);

 94 }

 95 int main()

 96 {

 97     int cnt=0,t1=0;

 98     while(scanf("%s %d%I64d",p[cnt].str,&p[cnt].n,&p[cnt].w)==3)

 99     {

100         if(p[cnt].str[0]=='A')

101         {

102             x[t1++]=p[cnt].w;

103         }

104         cnt++;

105     }

106     sort(x,x+t1);

107     t1=unique(x,x+t1)-x;

108     build(1,0,t1-1);

109     for(int i=0; i<cnt; i++)

110     {

111         if(p[i].str[0]=='A')

112         {

113             deal(1,p[i].n,p[i].w);

114         }

115         else

116         {

117             if(tree[1].num<p[i].n) printf("UNHAPPY\n");

118             else

119             {

120                 if(search1(1,p[i].n)>p[i].w) printf("UNHAPPY\n");

121                 else

122                 {

123                     printf("HAPPY\n");

124                     change(1,p[i].n);

125                 }

126             }

127         }

128     }

129     return 0;

130 }
View Code

 

你可能感兴趣的:(ICE)