資料備份BZOJ1150

2021-10-02 17:09:57 字數 935 閱讀 6749

題幹在這:bzoj1150

我們注意到選取的一定是相鄰的邊,那我們先求出兩兩之間相隔的距離d[i]。可知如果我們選了d[i],那麼我們就不能選d[i-1]和d[i+1]。我們每次找到乙個最小的值d[i],並把d[i],d[i-1]和d[i+1]刪去;我們又要保留選d[i-1]和d[i+1]的可能性,所以再在原位插進去值為d[i-1]+d[i+1]-d[i]的點。

我們用乙個優先佇列得到最小值,並用np和pp記錄某個點下乙個點和上乙個點的位置,並且每次操作實時更新。

注意邊界條件,如果選了邊上的點,則該點邊上的點一定不會被選,所以直接刪去這兩個點就好。

為了防止複雜的討論,在兩端插入值為inf的點,這兩個點顯然不會被選,簡化了操作

#include

#include

#include

#include

#include

#define n 100010

#define inf 0x3f3f3f3f

using

namespace std;

int locate[n]=;

struct point

}distant[n]

;int mark[n]

;int np[n]

, pp[n]

;priority_queue solve;

intmain()

while(1

) point mid = solve.

top();

solve.

pop();

sum +

= mid.val;

if(np[mid.self]

== n)

else

if(pp[mid.self]==0

)else

k--;}

}

BZOJ 1150 資料備份

1150 ctsc2007 資料備份backup time limit 10 sec memory limit 162 mb submit 1480 solved 592 submit status discuss description 你在一家 it 公司為大型寫字樓或辦公樓 offices 的...

BZOJ 1150 資料備份

你在一家 it 公司為大型寫字樓或辦公樓 offices 的計算機資料做備份。然而資料備份的工作是枯燥乏味 的,因此你想設計乙個系統讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計算機遊戲的樂趣。已知辦公 樓都位於同一條街上。你決定給這些辦公樓配對 兩個一組 每一對辦公樓可以通過在這兩個建築物之...

BZOJ 1150 資料備份Backup

算是套路的貪心,因為給出資料是有序的,先將相鄰的搞成線段存進堆裡,每次取出乙個最小的值,加到總值中,並改變左右的鍊錶值,並將左右線段值存入當前位置作為撤銷操作。include include include define mk a,b make pair a,b using namespace st...