【第六届山东省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;
}

(如有错误,欢迎指出,转载请注明出处)

时间: 2024-10-27 05:20:04

【第六届山东省ACM竞赛】B题 Lowest Unique Price(SDUT3252)的相关文章

【第七届山东省ACM竞赛】Square Number

思路比较明确,就是一个数,如果和另外一个数乘起来是个平方数的话,那么满足一个条件 数A可以分解成为n1 个 a1,n2 个 a2 -- 数B可以分解成为m1个 a1,m2 个 a2-- 这满足的条件是(ni + mi) % 2 == 0 一个数的分解出来奇个数的因子乘起来得到的值为v,找之前有几个数他的奇个数因子成积为v 代码如下: #include<cmath> #include<cstdio> #include<cstring> #include<iostre

山东省第六届ACM竞赛 Lowest Unique Price(set+map)分析,总结

题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3252 题意不难理解:每个人依次竞价投标 有三种操作 b 投标, c 撤销投标, q查询: 每次查询的结果是 Lowest Unique Price 也就是 "最小的独一无二的数",如果没有输出 "none": 比赛的时候我给队友讲完这道题目的题意,他们都说用线段树做,我也没多想,感觉题目不难,他们应该能做

第十届山东省acm省赛补题(2)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      Memory Limit: 65536 KB Recall the definition of the median of  elements where  is odd: sort these elements and the median is the -th largest element.

河南省第六届大学生程序设计竞赛--异形卵

异 形 卵 Time Limit: 1 Second    Memory Limit: 64 MB Description 我们探索宇宙,是想了解浩瀚星空的奥妙,但我们却很少意识到宇宙深处藏匿的危险,它们无时无刻不紧盯着我们的地球.如果外星人拜访我们,结果可能与哥伦布当年踏足美洲大陆不会有什么两样,这是历史,也是现实. 在ZDM-777星球上发现的休眠异形卵,其外表与常见的卵不同,表面被一层石墨覆盖.当人走近时,那层石墨开始消融,能看到里面的异形卵正在活动,异形卵是活物,具备一些热量或压力传感器

hdu1212 Big Number &amp;第六届山东省赛Single Round Math (同余定理,大数取模)

题目链接:Big Number 题目大意:每次输入两个数,第一个是高精度,第二个数小于100000:求 a mod b 根据同余定理: (a+b)% c = (a%c+ b%c)%c (a*b)%c =  ( a%c* b%c)%c 所以 对于大数,例如 :123 可以这样分解 123 =  (1*10+2)*10 + 3: 123 % c =   (  (  (  1%c *  10%c)%c + 2%c) %c  * 10%c) + 3 %c  ) %c; 因此,我们用字符串处理这个数,通过

△2013山东省ACM竞赛-Alice and Bob

Alice and Bob Description Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1). Then Alice ask Bob Q questions. In the expansion

河南省第六届大学生程序设计竞赛--Card Trick

Card Trick Time Limit: 2 Seconds    Memory Limit: 64 MB Description The magician shuffles a small pack of cards, holds it face down and performs the following procedure: 1. The top card is moved to the bottom of the pack. The new top card is dealt fa

第六届湘潭市程序设计竞赛 -Happy Number

Happy Number Accepted : 110   Submit : 263 Time Limit : 1000 MS   Memory Limit : 65536 KB  Problem Description Recently, Mr. Xie learn the concept of happy number. A happy number is a number contain all digit 7 or only 1 digit other than 7. For examp

河南省第六届大学生程序设计竞赛--外星人的供给站

外星人的供给站 Time Limit: 2 Seconds    Memory Limit: 512 MB Description 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识.比如,我们所知的任何生命都离不开液态水,并且都是基于化学元素碳(C)的有机分子组合成的复杂有机体. 42岁的天文学家Dr. Kong已经执著地观测ZDM-777星球十多年了,这个被称为"战神"的红色星球让他如此着迷.在过去的十多年中,他经常