資料結構專題 解題報告 J

2021-09-21 18:53:34 字數 1290 閱讀 3311

原題洛谷p1484種樹,又撿到一題做過的,lucky。

所謂用堆來解決問題,從來就是乙個詞,貪心,堆的使用是否成功取決於你貪心的策略,而貪心一般來說處理起全域性最優是有難度的,本題引入了乙個小有名氣的高階貪心策略,反悔貪心

通過讀題,我們發現貪心有乙個尷尬之處在於,你如果選擇了此刻的最大值i,那麼在選擇兩個的條件下,

你只能選擇a[j]+a[i] (j !=i-1 && j != i+1)

但是這無法保證一定存在a[i]+a[j] > a[i-1]+a[i+1],這種時候怎麼處理呢?

我們想,選擇a[i]和選擇a[i-1]+a[i+1]一定是不相容的,所以我們可以計算乙個反悔值a[i-1]+a[i+1]-a[i],壓入佇列,如果後面計算時能夠呼叫它自然會替換之前的a[i],注意壓入前要更新反悔節點左右的關係,方便做之後的反悔節點。

這裡處理一下左右邊界使成環就行l[1] = n; r[n] = 1;。其他的按著題意來。

ac**如下:

#include#define maxn 200005

#define maxm 30000005

#define for(a, b, c) for(int a=b; a<=c; a++)

#define qhqh 1000000007

#define inf 2147483647

#define llinf 9223372036854775807

#define ll long long

#define pi acos(-1.0)

#define ls p<<1

#define rs p<<1|1

using namespace std;

ll ans;

int n, m, a[maxn];

int l[maxn], r[maxn];

bool vis[maxn];

struct node

};priority_queueq;

inline int read()

while(c>='0'&&c<='9')

return x*f;

}int main()

for(i, 1, n)

);r[i] = i+1; l[i] = i-1;

}l[1] = n; r[n] = 1;

for(i, 1, m)

cout

}

資料結構專題 解題報告 N

很板的題,我建了三棵樹,分別維護區間和最大值最小值,當然更簡潔的寫法是結構體一次掛三個屬性。不過也沒差其實。要注意的是,查詢時初始化最小值最大值要用llinf,之前定義的inf是不夠的,詳見我的巨集定義。話說這兩個還是之前偷看zh的cf上的 學來的 斜眼笑 include define maxn 1...

暑期前專題題解 資料結構 J

並查集的乙個好題目,因為石頭剪刀布的三角關係,我們可以用0表示兩個同類,1表示被它的父親克制,2表示克制它的父親,那麼乙個節點和爺爺節點的關係就變成了,re x re pre x 3 因為並查集帶壓縮路徑,所以最後join時,最多存在乙個四邊形的關係,討論x和y的根節點是否相同即可。如下 inclu...

資料結構 解題報告

給乙個長為 n 的 a 定義 n times n 的 b sum limits ra i 兩個操作,修改 a p 為 x 詢問 b 的歷史最小值。我居然把d1t1鴿到d4晚上.歷史最值 kd tree 先離線的把點放到kd tree中 要離散化 然後就是矩形加和單點查詢,打一下歷史最值的標記就好了 ...