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

比赛的时候我给队友讲完这道题目的题意,他们都说用线段树做,我也没多想,感觉题目不难,他们应该能做出来,接着就去翻译别的题了

但是他们在调试的时候遇到了问题。。。。

时间已经过去很久了(当时我们队很快A了三道题,结果卡在了这里),我才开始想怎么解这道题,,只是我手笨,,在纸上调试的效率太低,最后他们都没辙了,我才去敲得代码

结果很轻易的就过了样例:

【当时是这样写的】

#include <iostream>
#include <map>
#include <set>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int t;
        cin>>t;
        char ch;int co;
        set<int>se;
        map<int ,int >mp;
        for(int i=0;i<t;i++)
        {
            cin>>ch;
            
            switch(ch)
            {
                
                case 'b':cin>>co;se.insert(co);mp[co]++;break;//最开始用的数组储存的每个值的个数,超时, 后来换成的map,可是还是超时!!
                case 'c':mp[co]--;break;
                case 'q':int sign=0;
                for( set<int>::iterator it =se.begin();it!=se.end();++it)//照的lrj书上的代码敲得 //由于set中的数是递增的,所以依次遍历,直到找到,找不到输出none
                {
                    if(mp[*it]==1)
                    {
                        cout<<*it<<endl;
                        sign=1;
                        break;
                    }
                }
                if(!sign)
                    cout<<"none"<<endl;break;
            }
        }
    }
    return 0;
}

连超两次时,,信心大减啊,我们都开始怀疑这个方法的正确性555, 的确,我用set 却不知道set的复杂度,而且交的太匆忙。

后来他们继续调试线段树,而我想搞清楚为啥超时,, 后来在白皮书找到了 set map的 每次插入 查找 和删除 的时间与 ”元素个数的对数“ 呈线性关系,也就是 O(nlogn)的复杂度,

我看题目数据 n有 200000 t 有 60 如果是极限情况肯定超时了(每次插入两个一样的,那个带迭代器的for循环肯定会超时,如果是O(n)的复杂度还可以一试)

这下对这种方法失望了,,

可是,眼看着队友还是没调试出结果,我又拾起了代码去想, 不一会又有了想法  要是我把投标多于一次的数 从set中删除, 然后如果 有人撤销投标,投标数又变成1,再把它插入set  这样不就不用查找了吗!?   set中元素从小到大排列好的,那么第一个数,不就是结果了么,连查找都不用!!如果为空,就输出none!!

我很快把思路给队友说 ,也没管他听不听懂,,就直接去敲代码了,当时真是激动   ,还是太年轻。。

#include <iostream>
#include <map>
#include <set>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int t;
		cin>>t;
		char ch;int co;
		set<int>se;
		map<int ,int >mp;
		for(int i=0;i<t;i++)
		{
			cin>>ch;

			switch(ch)
			{

				case 'b':cin>>co;se.insert(co);
                                        mp[co]++;if(mp[co]>1) se.erase(co); break; //对set用的太少,erase这个函数还是在map的模板中找的
                                                                                   //当时还不知道对不对
                                case 'c':mp[co]--; if(mp[co]==1) se.insert(co);break;
				case 'q':int sign=0;
				for( set<int>::iterator it =se.begin();it!=se.end();++it)//后面的没有修改,测试样例一下就通过了
				{
					if(mp[*it]==1)
					{
						cout<<*it<<endl;
						sign=1;
						break;
					}
				}
				if(!sign)
					cout<<"none"<<endl;break;
			}
		}
	}
	return 0;
}

事实证明 又一次让队友失望了,,,还是超时!!!  真是崩溃了。。  这下我们更加怀疑这个方法的正确性了。。

这时候我想起了白皮书上的 一句话, STL还是挺快的,尽管如此,对于一些时间要求非常高的题目,也会成为性能瓶颈。。

完了,想到这,这个方法就这样弃了555,, 时间剩余不多,队友继续调试树,,大家都很着急,,开始疯狂的提交。。

其实,set想到这里,离YES就剩一步之遥了,, 不,就剩下一行代码了,,可是我们却放弃了。。

出了考场,和欧神一交流,,发现他们也用的set ,而且过了,顿时血崩,再一讨论,我很快想到了自己疏忽的地方。

今天山理工挂出了省赛题,,就花了几分钟,一次AC了:

【AC代码】

#include <iostream>
#include <map>
#include <set>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int t;
		cin>>t;
		char ch;int co;
		set<int>se;
		map<int ,int >mp;
		for(int i=0;i<t;i++)
		{
			cin>>ch;

			switch(ch)
			{
				case 'b':cin>>co;se.insert(co);mp[co]++;
				if(mp[co]>1) se.erase(co);break;
				case 'c':cin>>co; mp[co]--;
				if(mp[co]==0) se.erase(co);//如果,撤销之后一次也没有了,就把他从set中删除//就是没想到这里<img alt="哭" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif" />
				if(mp[co]==1) se.insert(co);break;
				case 'q':
				if(!se.empty())
					cout<<*se.begin()<<endl;
				else
					cout<<"none"<<endl;break;
			}
		}
	}
	return 0;
}

说到底 还是基础太差,首先对stl性能不了解,接口也不大会用,开始超时那么多次,太影响心情,

然后就是配合,要是我把这题的思路给队友讲清楚,两个人去思考这个方法,,就一定能解出来的。

还有就是比赛心态,太着急了,交的太快,个人赛的时候还好,但是团体赛wa一次很影响士气的,所以一定要提高正确率;

FIGNTING--

时间: 2024-12-16 09:42:33

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

没有什么不可能—记山东省第六届ACM程序设计竞赛(退役总结帖)

大一下学期,第一次听说了ACM这个词,当时每周六也开设了培训课,但我好像一次也没有去过,当时对这个词并没有什么太大的印象.后来学院里引进了自己的OJ,那时候我连基本的输入输出格式都不懂,当经历了一堆的WA,TLE之后突然换来的一个AC竟带来了莫名的喜悦.后来学院举办了第一届ACM程序设计竞赛,我报名参加了新秀赛和团队赛.三个小时的新秀赛,当时貌似做出了三道,意外的拿到了一等奖,这也成为了我大学生活的一个重要转折点.四个小时的团队赛,做得很艰难,各种不会,最后只做出了一道,排在三等奖的末尾.比赛之

山东省第七届ACM竞赛 J题 Execution of Paladin (题意啊)

题意:鱼人是炉石里的一支强大种族,在探险者协会里,圣骑士有了一张新牌,叫亡者归来,效果是召唤本轮游戏中7个已死鱼人.如果死掉的不足7个,那么召唤的数量就会不足7. 鱼人有很多,下面的4个是: 寒光智者:3费,2攻,2血,战吼:双方玩家各抽2张牌. 鱼人领军:3费,3攻,3血,其他鱼人获得+2/+1. 蓝腮战士:2费,2攻,3血,冲锋. 老瞎眼:4费,2攻,3血,冲锋.战场上每有1个其他鱼人就会使其获得+1攻击. 下面给一些说明: 法力:召唤随从的消耗.技能效果召唤的随从不消耗额外法力,只会消耗卡

山东省第七届ACM竞赛 C题 Proxy (Dijkstra算法,单源路径最短问题)

题意:给定0-n+1个点,和m条边,让你找到一条从0到n+1的最短路,输出与0相连的结点... 析:很明显么,是Dijkstra算法,不过特殊的是要输出与0相连的边,所以我们倒着搜,也是从n+1找到0, 那么不就能找到与0相连的边么,注意判断相等值的时候.当时写错了好多次,就是没有考虑好边界. 代码如下: #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #

山东省第六届ACM省赛 H---Square Number 【思考】

题目描述 In mathematics, a square number is an integer that is the square of an integer. In other words, it is the product of some integer with itself. For example, 9 is a square number, since it can be written as 3 * 3. Given an array of distinct intege

河南省第六届acm省赛 异 形 卵(暴力)

异 形 卵 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 我们探索宇宙,是想了解浩瀚星空的奥妙,但我们却很少意识到宇宙深处藏匿的危险,它们无时无刻不紧盯着我们的地球.如果外星人拜访我们,结果可能与哥伦布当年踏足美洲大陆不会有什么两样,这是历史,也是现实. 在ZDM-777星球上发现的休眠异形卵,其外表与常见的卵不同,表面被一层石墨覆盖.当人走近时,那层石墨开始消融,能看到里面的异形卵正在活动,异形卵是活物,具备一些热量或压力传感器这些基本的中枢神经系统,通过感知周

【第六届山东省ACM竞赛】B题 Lowest Unique Price(SDUT3252)

题目链接:Here 这一题是我今年省赛最大的遗憾啊.诶...想想就觉得伤心啊.这一题其实不难,但是比赛时,我已经先到了怎么做,但是由于鄙人的失误,结果导致我们队后两个小时的时间都耗在那里了.越想越觉得可惜啊.我们现在看看这题的思路吧. 这一题,貌似大多人都是有STL的set做的.其实,这一题可以用线段树做(不知道线段树的童鞋请移步:这里),而且还是简单的单点更新问题.不知道单点更新的同学请移步:这里.虽然我做线段树的题目不是很多,但是我发现了一个规律.利用这个规律就可以更好的判断,此题是否为线段

&amp;quot;浪潮杯&amp;quot;第六届ACM山东省省赛山科场总结

从空间拷过来的.尽管已经过去一个月了.记忆犹新 也算是又一次拾起这个blog Just begin 看着一群群大牛还有队友男神的省赛总结都出了 我最终也耐不住寂寞 来做个流水账抒抒情好了 第一次省赛 心情非常激动 也掺杂着一点小紧张 事实上最想吐槽的是伙食 真的真的真的真的吃不饱.. . 只是非常感谢我们xh老师提供的x牛和x力架 正式赛的时候根本没心思吃午饭 x牛确实提供了非常多能量(我真的没有打广告 你看 都打码了 嗯) 转回正题 说好的是来做流水账的 九号早七点集合从淄博出发 睡到了大青岛

&quot;浪潮杯&quot;第六届ACM山东省省赛山科场总结

从空间拷过来的,虽然已经过去一个月了,记忆犹新 也算是重新拾起这个blog Just begin 看着一群群大牛还有队友男神的省赛总结都出了 我终于也耐不住寂寞 来做个流水账抒抒情好了 第一次省赛 心情很激动 也掺杂着一点小紧张 其实最想吐槽的是伙食 真的真的真的真的吃不饱...不过很感谢我们xh老师提供的x牛和x力架 正式赛的时候根本没心思吃午饭 x牛确实提供了很多能量(我真的没有打广告 你看 都打码了 嗯) 转回正题 说好的是来做流水账的 九号早七点集合从淄博出发 睡到了大青岛 其实某种意义

山东省第六届“浪潮杯”ACM程序设计大赛:D:Square Number

Description: In mathematics, a square number is an integer that is the square of an integer. In other words, it is the product of some integer with itself. For example, 9 is a square number, since it can be written as 3 * 3. Given an array of distinc