洛谷 P1484 種樹

2022-04-07 01:37:25 字數 1249 閱讀 5533

本題說每選乙個坑,它的左右兩個坑都不能選了,可是我們沒有辦法確定我們選某個坑一定是最優解,怎麼辦呢?

我們設定乙個反悔機制,每當選乙個坑,就新設定乙個點,使這個點的值為這個坑兩邊的和減去當前坑的差.

為什麼這樣做是對的呢?

感性想一下,如果再後面的選坑過程中,我們選到了這個新設定的點,說明我們選上文的那個坑不是最優解,而它的兩邊更優,那麼答案加上新設定的點的值,其實就等價於選那個坑的兩邊.

我們將所有值扔進乙個大根堆中,一直選,直到堆頂為負數,或選夠了k個坑為止.

當然了,我們每選乙個坑就用乙個bool變數標記它的左右兩個坑不可選.

1 #include2 #include3 #include4 #include5 #include6

7using

namespace

std;89

int n,k,l[500002],r[500002

];10

long

long ans,c[500002

];11

bool p[500002

];12

struct

kkk

17 }e[500002

];18 priority_queuea;

1920

intmain()

31 r[0] = 1

;32 l[n] = n + 1;33

for(int i = 1;i <= k; i++)

40kkk t;

41 t =a.top();

42a.pop();

43 ans +=t.v;

44 p[l[t.id]] = p[r[t.id]] = 0

;45 c[t.id] = 0 - c[t.id] + c[l[t.id]] +c[r[t.id]];

46 t.v =c[t.id];

47 l[t.id] =l[l[t.id]];

48 r[t.id] =r[r[t.id]];

49 l[r[t.id]] =t.id;

50 r[l[t.id]] =t.id;

51a.push(t);52}

53 printf("

%lld

",ans);

5455

return0;

56 }

洛谷 P1484 種樹 思維 堆

洛谷 p1484 種樹 思維 堆 很容易想到用乙個大根堆來儲存每個位置的獲利,但我們不能每次都取出根元素後,將其兩邊的元素標記位不可選擇,因為這個根元素兩邊的元素之和很可能大於這個根元素,這時我們選擇的就不是根元素,而是兩邊的元素,所以我們要有乙個反悔選擇的機會,我們在選擇根元素的時候,在總獲利中加...

洛谷P1484種樹(堆 較難貪心)

題意很清晰很好懂,做起來就難了。資料範圍小的化可搜尋可dp,but資料這麼大是不可能的了,較難貪心 a i 或左加右只選乙個最大的 堆 每次取出最大的 1 include 2 include 3 include 4 using namespace std 5 typedef long long ll...

後悔貪心法 種樹(洛谷 P1484)

題目描述 cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少 可能為負 請你幫助他計算出他的...