原題洛谷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中 要離散化 然後就是矩形加和單點查詢,打一下歷史最值的標記就好了 ...