1. 程式人生 > >poj 1456 Supermarket(並查集維護區間)

poj 1456 Supermarket(並查集維護區間)



題意:有一些貨物,每個貨物有價值和賣出的截至日期,每天可以賣一個貨物,問能賣出的最大價值是多少。

思路:演算法不難想到,按價值降序排列,對於每一件貨物,從deadline那天開始考慮,如果哪天空閒那麼將貨物在該天賣出。

如果直接暴力來做,複雜度為o(n*n),顯然不行。可以用並查集來維護當前ddl之前空閒的最近的一天,如果父節點為0說明deadline之前沒有空閒的時間,那麼該貨物就無法賣出。

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
#include<set>
#define eps 1e-6 
#define LL long long  
using namespace std;  

const int maxn = 10000 + 100;
const int INF = 0x3f3f3f3f;
int pre[maxn];
int n;
struct Prod {
	int val, ddl;
	bool operator < (const Prod& A) const { return val > A.val;}
} prod[maxn];

int find(int x) {
	if(x == pre[x]) return x;
    return pre[x] = find(pre[x]);
}

void init() {
	for(int i = 1; i < 10005; i++) pre[i] = i;
	for(int i = 0; i < n; i++) cin >> prod[i].val >> prod[i].ddl;
}

void solve() {
	int ans = 0;
	sort(prod, prod+n);
	for(int i = 0; i < n; i++) {
		if(find(prod[i].ddl)) {
			ans += prod[i].val;
			pre[pre[prod[i].ddl]] = find(pre[prod[i].ddl]-1);
		} 
	}
	cout << ans << endl;
}

int main() {
	//freopen("input.txt", "r", stdin);
	while(scanf("%d", &n) == 1) {
		init();
		solve();
	}
	return 0;
}











相關推薦

poj 1456 Supermarket(維護區間)

 題意:有一些貨物,每個貨物有價值和賣出的截至日期,每天可以賣一個貨物,問能賣出的最大價值是多少。 思路:演算法不難想到,按價值降序排列,對於每一件貨物,從deadline那天開始考慮,如果哪天空

poj 1611The Suspects(維護根節點)

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 51095  

Codeforces Round #484 (Div. 2) D. Shark—— 維護區間 + 想法

題意: 給你n天一隻鯊魚每天遊的距離,讓你找一個k,並有三個要求: 1.在每一個區間逗留的天數相同(比如說k=3,那麼假設有5天,1 3 2 4 5,第一天在一個區間逗留,第二第三天在一個區間逗留,只要每天遊的距離不超過k就算在一個區間內) 2.逗留的區間儘可

【bzoj 2102】 [HNOI2005]狡猾的商人 帶權維護區間

以為是掃描演算法,想了半天最後看人家說是並查集我一下子就懵逼了,畢竟是第一次用並查集來維護區間和 這裡為啥要用並查集呢,因為每一段的區間和可以為負數,所以如果兩端區間之間沒有端點相交,那麼就是互不影響

Restructuring Company和Almost Union-Find 區間的刪除

whether who cfa elong cal proc rod question mine Restructuring Company Even the most successful company can go through a crisis period

Knight Tournament 偽區間

rst hat put cif after line spec class std Knight Tournament Hooray! Berl II, the king of Berland is making a knight tournament. The kin

poj 2236【

proc cau pos exp con computer from size ble poj 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Me

poj-1182-食物鏈(

題目地址 http://poj.org/problem?id=1182 解題思路 對於每隻動物i創造三個元素i-A, i-B, i-C, 並用這3*N個元素建立並查集。 i-x表示“i屬於種類x” 並查集裡的每一組內所有元素代表的情況都同

HUD 3038 帶權 解決區間和矛盾問題

How Many Answers Are Wrong TT and FF are ... friends. Uh... very very good friends -________-b  FF is a bad boy, he is always wooing TT to play

POJ - 1182(種類)

動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。 有人用兩種說法對這N個動物所構成的食物鏈關係進行描述: 第一種說法是"1 X Y",表示X和Y是同類。 第二種

牛客練習賽32 D Tarjan無向圖求橋+維護

題目描述: 小p和他的朋友約定好去遊樂場遊玩,但是他們到了遊樂場後卻互相找不到對方了。 遊樂場可以看做是一張n個點,m條道路的圖,每條道路有邊權wi,表示第一次經過該道路時的花費(第二次及以後經過時花費為0)。 現在,小p要去找他的朋友,但他的朋友行蹤很詭異,小p總是要遍歷完這n個點才能找到他,

POJ 1703 種類

The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and G

poj 1988Cube Stacking(路徑壓縮 求本節點到父節點的結點數)

Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 28664 Accepted: 10067 Case Time Limit: 1000MS

Codeforces325 D【維護連通性】

思路: 因為是環,所以可以複製一下圖,先判斷一下和他是不是和與他相鄰的8個之一的一個障礙使得構成了一個環,環就是一個連通,用並查集維護即可; 如果沒有就ans++,然後並把這個點加入。 大致意思就是這樣。 #include <cstdio> #include

codeforces—Royal Questions(維護最大基環外向樹)

In a medieval kingdom, the economic crisis is raging. Milk drops fall, Economic indicators are deteriorating every day, money from the treasury disappear.

bzoj4025 二分圖(線段樹分治+帶權維護路徑長奇偶性)

bzoj4025 二分圖 題意: 神犇有一個n個節點的圖。因為神犇是神犇,所以在T時間內一些邊會出現後消失。神犇要求出每一時間段內這個圖是否是二分圖。 資料範圍 n<=100000,m<=200000,T<=100000,1<

hdu5923(維護聯通塊)

前一篇博文說這題t了,今天看了一下別人的寫法發現有個地方複雜度確實常數有點大。 對magic tree上的每個點維護它到根的點的集合(並且是原圖的生成樹,這樣點集的大小是O(n)的),這樣的話之後詢問

Poj 1182 食物鏈 (

食物鏈 Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 67954Accepted: 20088Description動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B,

Restructuring Company (區間合併)

題目大意: 一共有n個單點集,三種操作:  type1  x y代表:合併x和y所在集合  type2  x y代表 :合併x,x+1,…,y-1,y(x到y的區間)所在集合  type3  x y代表 :查詢x和y是否在同一集合  是 輸出YES, 否 輸出NO 思

poj 1182 食物鏈()

Description 動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。  現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們