poj1456 並查集or線段樹

2021-06-20 20:36:08 字數 988 閱讀 7473

本來做並查集專題看到的題目,但是卻是用線段樹a掉的,感覺這題用線段樹做挺水的。

先將物品按價值降序排序,然後依次查詢,每個物品的最後期限,就相當於給了線段樹查詢範圍,在1~d範圍內找還有沒有空餘的點,有的話則占用,更新線段樹,單點更新,感覺比較簡單。

如果用並查集的話,題目將用過的天作為乙個集合,排序之後,查詢每個物品的最後期限,並查集裡集合的根設為這個集合裡沒有用過的最小的點,如果查到的根是0,就證明這個物品在1到最後期限內都沒有點可以用,之前的是最優解,如果查到的不是0,則將查到的一天占用,將集合與查到的一天的前一天合併並以前一天作為根節點,加上路徑壓縮會快一點。

奇葩的是,線段樹和並查集兩種寫法耗時都是313ms,這巧合,無語了。

線段樹**:

#include #include #include using namespace std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define delf int m=(l+r)>>1

int sum[50005];

int ans,n;

int p;

struct node

m[10005];

void pushup(int rt)

void build(int l,int r,int rt)

delf;

build(lson);

build(rson);

pushup(rt);

}void update(int i,int l,int r,int l,int r,int rt)

bool cmp(node a,node b)

int main()

m[10005];

bool cmp(node a,node b)

void init()

int find(int x)

void union(int a,int b)

}cout<

POJ 1456 (貪心 並查集)

題目鏈結 有n件物品,每件物品有個價值和最後的保質期,如果物品在保質期內賣出能拿到對應的價值。沒件物品賣出要1天時間。問n件物品能拿到的最大價值。先貪心排序價值。值的先 而1到t時間段內空閒時間用並查集來維護。每次賣出一件時間。剩下的時間減1,直到為0 是剩下的時間,也就是fin t include...

POJ 1456 貪心 並查集

題目大意 給n個商品,每個商品有利潤pi和過期時間di,每天只能賣乙個商品,過期的不能再賣,求如何安排每天賣的東西使收益最大。題目思路 先將利潤從大到小排序,由於每個物品賣的越遲,給其他物品留下的空間也就越多,所以需要將物品放在能賣的最後一天賣。建立並查集,維護每個點最後乙個可以賣的地方,每賣出乙個...

poj 1456 貪心 並查集優化

題意 題目鏈結 有n個商品,每個商品有兩個屬性val 和day,val表示商品的價值,day 表示商品最後賣出去的期限,賣每個商品需要一天的時間。題解 貪心,貪心測率和hdu 1789 一樣。按照val從大到小排序。然後從第乙個開始,如果它的最後期限沒有被占用,這天就用來買這件商品,如果被占用就在這...