題目背景
小明準備給小紅送一束花,以表達他對小紅的愛意。他在花店看中了一些花,準備用它們包成花束。
題目描述
這些花都很漂亮,每朵花有乙個美麗值w,**為c。
小明一開始有乙個空的花束,他不斷地向裡面新增花。他有以下幾種操作:
操作含義
1 w c 新增一朵美麗值為w,**為c的花。
3 小明覺得當前花束中最便宜的一朵花太廉價,不適合送給小紅,所以刪除最便宜的一朵花。
2 小明覺得當前花束中最貴的一朵花太貴,他心疼自己的錢,所以刪除最貴的一朵花。
-1 完成新增與刪除,開始包裝花束
若刪除操作時沒有花,則跳過刪除操作。
如果加入的花朵**已經與花束中已有花朵**重複,則這一朵花不能加入花束。
請你幫小明寫乙個程式,計算出開始包裝花束時,花束中所有花的美麗值的總和,以及小明需要為花束付出的總**。
輸入格式:
若干行,每行乙個操作,以-1結束。
輸出格式:
一行,兩個空格隔開的正整數表示開始包裝花束時,花束中所有花的美麗值的總和。以及小明需要為花束付出的總**。
說明
對於20%資料,運算元<=100,1<=w,c<=1000。
對於全部資料,運算元<=100000,1<=w,c<=1000000。
其實挺裸的
唯一的坑點-----為什麼題目要把操作序號反著寫啊啊啊啊啊啊啊(掀桌)
總之具體解釋見注釋吧
#include
#include
#include
#include
#include
#include
using
namespace std;
intread()
while
(ss>=
'0'&&ss<=
'9')
return f*x;
}void
print
(int x)
if(x>9)
print
(x/10);
putchar
(x%10
+'0');
}struct node
intcmp
(int x)};
node* rt=
null
;int sumw,sumc;
int w,c;
bool judge[
1000010];
void
rotate
(node*
&p,int d)
void
ins(node*
&p,int x)
int d=p-
>
cmp(x)
;ins
(p->ch[d]
,x);
if(p-
>ch[d]
->r < p-
>r)
rotate
(p,d^1)
;}void
del(node*
&p,int d)
//左/右孩子不為空,說明還有更小/大的,繼續向下尋找
else
}int
main()
else
if(k==2)
del(rt,1)
;//刪除最大就找最右的孩子
else
if(k==3)
del(rt,0)
;//刪除最小反之
}print
(sumw)
;printf
(" ");
print
(sumc)
;return0;
}
洛谷P2073 送花 Treap
小明準備給小紅送一束花,以表達他對小紅的愛意。他在花店看中了一些花,準備用它們包成花束。這些花都很漂亮,每朵花有乙個美麗值w,為c。小明一開始有乙個空的花束,他不斷地向裡面新增花。他有以下幾種操作 操作 含義 1 w c 新增一朵美麗值為w,為c的花。3 小明覺得當前花束中最便宜的一朵花太廉價,不適...
洛谷P2073 送花
小明準備給小紅送一束花,以表達他對小紅的愛意。他在花店看中了一些花,準備用它們包成花束。這些花都很漂亮,每朵花有乙個美麗值w,為c。小明一開始有乙個空的花束,他不斷地向裡面新增花。他有以下幾種操作 操作 含義 1 w c 新增一朵美麗值為w,為c的花。3 小明覺得當前花束中最便宜的一朵花太廉價,不適...
洛谷P2073 送花
小明準備給小紅送一束花,以表達他對小紅的愛意。他在花店看中了一些花,準備用它們包成花束。這些花都很漂亮,每朵花有乙個美麗值w,為c。小明一開始有乙個空的花束,他不斷地向裡面新增花。他有以下幾種操作 操作 含義 1 w c 新增一朵美麗值為w,為c的花。3 小明覺得當前花束中最便宜的一朵花太廉價,不適...