本來做並查集專題看到的題目,但是卻是用線段樹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從大到小排序。然後從第乙個開始,如果它的最後期限沒有被占用,這天就用來買這件商品,如果被占用就在這...