時間限制:2000ms 記憶體限制:65536kb
題目描述
有問題,找副連,無聊的時候當然也可以找他啦。小w找到了他的叔叔——東廠廠長——宇宙超級無敵老ws yy。他們叔侄兩個商量之後決定用彈弓打破社群裡的一些窗戶,但是彈弓每秒只能徹底打破一扇窗戶。而且如果某戶窗戶的主人回來了的話,他們就不能進行破壞了(不然會死得很慘的)。因為有的人裝的玻璃好,有的人裝的玻璃差,有的人裝的玻璃高,有的人裝的玻璃矮,所以你不能要求他們叔侄兩個打破不同的窗戶獲得的快樂值必須相同。現在他們想知道在能活著的情況下能夠獲得的最大快樂值。
輸入第一行乙個正整數n,表示共有n個窗戶。
接下來n行,每行兩個整數,第乙個為窗子的主人回來的時刻(秒),第二個為破壞該窗戶所能獲得的快樂值。
輸出最大的快樂值。
輸入樣例 複製
41 19
2 10
1 20
2 15
輸出樣例 複製
35樣例說明:
在第0個時刻,他們選擇破壞掉3號窗戶,在第1個時刻,因為1號窗戶的主人已經回來了,所以不能去破壞1號窗戶,只能去破壞2號窗戶或4號窗戶,顯然選擇4號窗戶。總的快樂值就是20+15=35。
說明data constraint
20%的資料,n<=100。
40%的資料,n<=50000。
100%的資料,n<=200000,快樂值的絕對值不超過32767,時刻非負且小於2^31。
題解:按時間先後排序,倒序做,將元素依次加入大根堆中,時間改變時取出堆頂
注意:1.堆的空間開兩倍 2.注意下移操作 3.資料有負數
const
maxn=400000;
inf='1101t2.in';
var heap:array[0..maxn]of int64;
a:array[0..maxn,1..2]of int64;
n,kk,ans:int64;
i,j:longint;
procedure swap(var x,y:int64);
var t:longint;
begin
t:=x;x:=y;y:=t;
end;
procedure up(x:longint);
var i:longint;
begin
i:=x;
while (heap[i]>heap[i shr 1])and(i shr 1>=1) do
begin
swap(heap[i],heap[i shr 1]);
i:=i shr 1;
end;
end;
procedure down(x:longint);
var i:longint;
begin
i:=x;
while ((heap[i*2]>heap[i])or(heap[i*2+1]>heap[i]))and(i*2<=heap[0]) do
begin
if (i*2+1>heap[0])and(heap[i*2]r then exit;
i:=l;j:=r;
key:=a[(l+r)div 2,1];
repeat
while a[i,1]>key do inc(i);
while a[j,1]j;
qsort(l,j);
qsort(i,r);
end;
procedure init;
var i:longint;
begin
readln(n);
for i:=1 to n do
readln(a[i,1],a[i,2]);
qsort(1,n);
end;
begin
// assign(input,inf);reset(input);
init;
for i:=1 to n do
begin
insert(a[i,2]);
if a[i,1]<>a[i+1,1] then
begin
kk:=a[i,1]-a[i+1,1];
while kk>0 do
begin
if heap[1]<0 then break;
dec(kk);
ans:=ans+heap[1];
delete;
if heap[0]=0 then break;
end;
end;
end;
writeln(ans);
// close(input);
end.
貪心 NOIP2018 鋪設道路
春春是一名道路工程師,負責鋪設一條長度為 n 的道路。鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區域,一開始,第 i 塊區域下陷的深度為 d i 春春每天可以選擇一段連續區間 l,r 填充這段區間中的每塊區域,讓其下陷深度減少 i 在選擇區間時,需要保證,區間內的每塊區...
NOIP2018複習 A(樹形DP)
時間限制 1000ms記憶體限制 256000kb 題目描述 lyh童鞋的手辦非常多,以至於他專門種了一棵樹來放置手辦 為了展現自己的收藏lyh決定從收藏樹上選取一些手辦展示 已知lyh的每個手辦都有不同的美麗值,第i個節點上有乙個美麗值為ai的手辦。lyh認為一種選取手辦的方案是合法的當且僅當選出...
NOIP2018複習 字典(字典樹)
第一行兩個數n,m,表示有n個字串,m個詢問。接下來n行,每行乙個字串ti 再接下來m行,每行乙個字串si output 對於每個詢問,輸出乙個ansi表示答案。題解 看到字首和只有abc,想到字典樹 先對原始的字串建立trie,對trie上每乙個點建立形如 1,0,0,1 的陣列,記錄第i個原始串...