洛谷 P2073 送花 Treap

2021-08-15 16:00:56 字數 1975 閱讀 3363

題目背景

小明準備給小紅送一束花,以表達他對小紅的愛意。他在花店看中了一些花,準備用它們包成花束。

題目描述

這些花都很漂亮,每朵花有乙個美麗值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 小明覺得當前花束中最便宜的一朵花太廉價,不適...