1. 程式人生 > >【第六屆山東省ACM競賽】B題 Lowest Unique Price(SDUT3252)

【第六屆山東省ACM競賽】B題 Lowest Unique Price(SDUT3252)

題目連結:Here

       這一題是我今年省賽最大的遺憾啊。誒。。。想想就覺得傷心啊。這一題其實不難,但是比賽時,我已經想到了怎麼做,但是由於鄙人的失誤,結果導致我們隊後兩個小時的時間都耗在那裡了。越想越覺得可惜啊。我們現在看看這題的思路吧。

       這一題,貌似大多人都是有STL的set做的。其實,這一題可以用線段樹做(不知道線段樹的童鞋請移步:這裡),而且還是簡單的單點更新問題。不知道單點更新的同學請移步:這裡。雖然我做線段樹的題目不是很多,但是我發現了一個規律。利用這個規律就可以更好的判斷,此題是否為線段樹的題目。

       規律:題目中一般有插入刪除之類的操作,資料範圍一般在10的5次方到10的6次方左右,這樣的題目一般都可以用線段樹來解(純屬個人經驗,如有例外歡迎指出,不過我還沒見過不服從這個規律的線段樹的題目,當然這個僅供參考)。

       現在我們言歸正傳。對於這一題我們應該怎麼用線段樹處理呢?我們利用結構體,定義兩個變數value, cnt。value用來儲存輸入的值(如果沒有輸入,那麼久給它一個很大的值),cnt用來記錄該節點的值被輸入的次數。如果輸入次數為1的話,那麼我們就讓 value 的值等於葉子節點的值。這樣題目就轉化為一個單點更新,區間最值問題了。具體操作,詳見程式碼。

       這一題還有一個坑,不知道省賽是是不是這樣。就是每一組操作後,它多給了一個空格例如:“b 2 ”這樣。千萬要注意,不然就是萬年RE。

【程式碼如下】

//因為 log2(1000000)約為 20
//所以樹的深度為20

#include <stdio.h>
#define MAXN 1<<20
#define Max 1e+6
#define INF 0xfffffff
#define min(a,b) a<b?a:b
struct ST{
	int value, cnt;
}node[2*MAXN];
int father[MAXN];
void build(int v, int left, int right){
	node[v].value = INF;
	node[v].cnt = 0;
	if (left == right){
		father[left] = v;
		return;
	}
	int mid = (left + right) / 2;
	build(2 * v, left, mid);
	build(2 * v + 1, mid + 1, right);
	return;
}
void Update(int ri){
	if (ri == 1) return; 
	int fa = ri / 2;
	int left = node[2 * fa].value;
	int right = node[2 * fa + 1].value;
	node[fa].value = min(left, right);
	Update(fa);
}
int main(){
	char ch[5];
	int T, n, num;
	scanf("%d", &T);
	while (T-- && scanf("%d", &n)){
		build(1, 1, Max);
		while (n--){
			scanf("%s", ch);
			if (ch[0] == 'q'){
				if (node[1].value == INF)
					printf("none\n");
				else
					printf("%d\n", node[1].value);
			}
			else{
				scanf("%d", &num);
				if (ch[0] == 'b')
					node[father[num]].cnt++;
				else if (ch[0] == 'c')
					node[father[num]].cnt--;
				if (node[father[num]].cnt == 1)
					node[father[num]].value = num;
				else
					node[father[num]].value = INF;
				Update(father[num]);
			}
		}
	}
	return 0;
}
(如有錯誤,歡迎指出,轉載請註明出處)

相關推薦

山東省ACM競賽B Lowest Unique Price(SDUT3252)

題目連結:Here        這一題是我今年省賽最大的遺憾啊。誒。。。想想就覺得傷心啊。這一題其實不難,但是比賽時,我已經想到了怎麼做,但是由於鄙人的失誤,結果導致我們隊後兩個小時的時間都耗在那裡了。越想越覺得可惜啊。我們現在看看這題的思路吧。        這一題,貌

山東省ACM競賽 A Nias and Tug-of-War(java)

Nias and Tug-of-War Time Limit: 1000MS Memory limit: 65536K 題目描述 Nias is fond of tug-of-war. One day, he organized a tug-of-war

山東省ACM大學生程序設計競賽個人總結

我們 斐波那契 實現 結果 。。 學校 合數 工作 們的 因為省賽,從開學緊張到5月7號。心思也幾乎全放在ACM的訓練上。因為我還是校臺球協會的會長,所以臺協還有一些事情需要忙,但是我都給延遲了。老會長一直在催我辦校賽,但我一直說 等等吧,因為校賽只能在周六

藍橋杯國賽C語言B組 2.完美正方形(dfs)

spa else img IT bool break main LG fill 如果一些邊長互不相同的正方形,可以恰好拼出一個更大的正方形,則稱其為完美正方形。 歷史上,人們花了很久才找到了若幹完美正方形。比如:如下邊長的22個正方形2 3 4 6 7 8 12 13 14

藍橋杯國賽C語言B組 1.積分之迷(水

水題 urn class %d names 風鈴 需要 藍橋 std 小明開了個網上商店,賣風鈴。共有3個品牌:A,B,C。為了促銷,每件商品都會返固定的積分。 小明開業第一天收到了三筆訂單:第一筆:3個A + 7個B + 1個C,共返積分:315第二筆:4個A + 10個

藍橋杯格子中輸出

題目:格子中輸出 StringInGrid函式會在一個指定大小的格子中列印指定的字串。 要求字串在水平、垂直兩個方向上都居中。 如果字串太長,就截斷。 如果不能恰好居中,可以稍稍偏左或者偏上一點。 下面的程式實現這個邏輯,請填寫劃線部分缺少的程式碼。 #include &l

藍橋杯立方尾不變

題目:立方尾不變 有些數字的立方的末尾正好是該數字本身。 比如:1,4,5,6,9,24,25,.... 請你計算一下,在10000以內的數字中(指該數字,並非它立方後的數值),符合這個特徵的正整數一

河南省大學生程式設計競賽 :異 形 卵

題目描述 我們探索宇宙,是想了解浩瀚星空的奧妙,但我們卻很少意識到宇宙深處藏匿的危險,它們無時無刻不緊盯著我們的地球。如果外星人拜訪我們,結果可能與哥倫布當年踏足美洲大陸不會有什麼兩樣,這是歷史,也是現實。 在ZDM-777星球上發現的休眠異形卵,其外表與常見的卵不同,表面被一層石墨覆蓋

河南省大學生程式設計競賽 ——異 形 卵

                        &nbs

山東省ACM省賽 A Julyed

Julyed Time Limit: 2000MS Memory Limit: 65536KB Problem Description     Julyed is preparing for her CET-6. She has N words to remember

hdu1212 Big Number &山東省賽Single Round Math (同餘定理,大數取模)

題目大意:每次輸入兩個數,第一個是高精度,第二個數小於100000;求 a mod b 根據同餘定理: (a+b)% c = (a%c+ b%c)%c (a*b)%c =  ( a%c* b%c)%

湖南省大學生程式競賽--戰場的數目

題目I 戰場的數目 在上題中,假設戰場的圖形周長為p,一共有多少種可能的戰場? 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總數模987654321的值。 輸入 輸入檔案最多包含25組測試資料,每個資料僅包含一

加法變乘法——藍橋杯C語言B組(省賽)

clu 自己 nbsp 加法 藍橋杯 重新 () std spa 原創 加法變乘法 我們都知道:1+2+3+ ... + 49 = 1225現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015 比如:1+2+3+...+10*11+12+...+27*28+29+

三羊獻瑞——藍橋杯C語言B組(省賽)

lan font oid 漢字 print ack size IV cnblogs 原創 三羊獻瑞 觀察下面的加法算式: 祥 瑞 生 輝 + 三 羊 獻 瑞 ------------------- 三 羊 生 瑞 氣 (如果有對齊問題,可以參看【圖1.jp

山東ACM省賽F-quadratic equation

圖片 註意 col sam num spa code pan follow 這個題困擾了我長達1年多,終於在今天下午用兩個小時理清楚啦 要註意的有以下幾點: 1.a=b=c=0時 因為x有無窮種答案,所以不對 2.註意精度問題 3.b^2-4ac<0時也算對 Prob

藍橋杯2015本科B組c/++部分解題報告

今天是2015年4月11日,昨天剛從hz趕回來,好久不寫程式碼,手感有些生疏,~~ 一、獎券數目(3分) 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。 雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(10000-9

藍橋杯 c/c++ B組 省賽 (3)——三羊獻瑞

三羊獻瑞觀察下面的加法算式:      祥 瑞 生 輝  +   三 羊 獻 瑞-------------------   三 羊 生 瑞 氣(如果有對齊問題,可以參看【圖1.jpg】)其中,相同的漢字

藍橋杯 c/c++ B組 省賽 (7)——牌型種數

牌型種數小明被劫持到X賭城,被迫與其他3人玩牌。一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出一個問題:如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?請填寫該整數,不要填寫

2015年4月藍橋杯c/c++B組省賽試題和個人解答

又一年的藍橋杯,好久沒那麼爽快的做題了,昨天上午剛考完藍橋杯,我把題帶出來了。不廢話,上題。      一、 獎券數目 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。 雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(

2016年 藍橋杯 全國總決賽B(完全平方數)

題目意思就是: 給你0,1,2,3,4,5,6,7,8,9十個數字,要你選出任意一個或幾個組合在一起成為完全平方數,每個數字都必須選且只能選一次,求可能的方案。 比如有其中幾種符合題意的情況: 0 16 25 73984 0 1 625 73984 0