题目背景
小明准备给小红送一束花,以表达他对小红的爱意。他在花店看中了一些花,准备用它们包成花束。
题目描述
这些花都很漂亮,每朵花有一个美丽值W,价格为C。
小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作:
操作 含义
1 W C 添加一朵美丽值为W,价格为C的花。
3 小明觉得当前花束中最便宜的一朵花太廉价,不适合送给小红,所以删除最便宜的一朵花。
2 小明觉得当前花束中最贵的一朵花太贵,他心疼自己的钱,所以删除最贵的一朵花。
-1 完成添加与删除,开始包装花束
若删除操作时没有花,则跳过删除操作。
如果加入的花朵价格已经与花束中已有花朵价格重复,则这一朵花不能加入花束。
请你帮小明写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。
输入输出格式
输入格式:
若干行,每行一个操作,以-1结束。
输出格式:
一行,两个空格隔开的正整数表示开始包装花束时,花束中所有花的美丽值的总和。以及小明需要为花束付出的总价格。
输入输出样例
输入样例#1:
1 1 1 1 2 5 2 1 3 3 3 1 5 2 -1
输出样例#1:
8 5
说明
对于20%数据,操作数<=100,1<=W,C<=1000。
对于全部数据,操作数<=100000,1<=W,C<=1000000。
【题目解释】
正解是线段树来搞
但是数据比较水,暴力也能卡一卡,下面是O(n) 的暴力,这题是对不起线段树的大名了(笑抽)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> int cnt=0; int x; bool flag=0; bool xx[1000001]={0}; using namespace std; struct node{ int w,c; }h[100010];int cmp2(const node a,const node b) { return a.c>b.c; } int cmp1(const node a,const node b)//cong xiao dao da { return a.c<b.c; } void ex() { sort(h+1,h+cnt+1,cmp1); xx[h[cnt].c]=0; cnt--; } void cheap() { sort(h+1,h+cnt+1,cmp2); xx[h[cnt].c]=0; cnt--; } int main() { scanf("%d",&x); while(x!=-1) { if(x==1) { int a,b; scanf("%d%d",&a,&b); if(cnt==0) { xx[b]=1; cnt++; h[cnt].w=a; h[cnt].c=b; } else { //sort(h+1,h+cnt+1,cmp1); if(xx[b]==0) cnt++, xx[b]=1, h[cnt].w=a, h[cnt].c=b; } } if(x==2) if(cnt>0) ex(); if(x==3) if(cnt>0) cheap(); scanf("%d",&x); } int ans1=0,ans2=0; for(int i=1;i<=cnt;i++) ans1+=h[i].w, ans2+=h[i].c; printf("%d %d",ans1,ans2); return 0; }