洛谷P1638 逛画展(双向队列)

news/2024/7/6 13:36:21 标签: 双向队列, STL

在算法标签中搜了单调队列,搜到了这道题,但实际做起来发现并不是个单调队列,只是个双向队列的应用罢了…
朴素算法是暴力枚举,时间复杂度是O(n),用双向队列优化后可以降为O(n)。
首先我们设置num[i],表示第i位画家的作品出现的次数,显然当num[1~m]都不为0时就可以看遍所以画家的作品,我们用sum记录当前还有多少位画家的作品还未出现,则当sum=0时就可以更新[a,b]区间。
接下来就是双向队列发挥作用了。我们从头到尾遍历数组,如果当前元素k不等于队首元素,则将它入队,if(!num[k]) sum- -, num[k]++;如果当前元素k等于队首,先将它入队,num[k]++,然后将队首元素弹出队,更新num[],再检查队首元素temp,num[temp]是否为1,不为1,继续弹出队并更新num[],继续检查队首元素,直到判断到队首元素temp,num[temp]=1时才终止。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
int p[maxn],num[2005]={0};
deque<int> Q;

inline void read(int &ret)
{
	char c;
	while((c=getchar())&&(c>'9'||c<'0'));
	ret=0;
	while(c<='9'&&c>='0')	ret=ret*10+c-'0', c=getchar();
}

int main()
{
	int n,m;
	read(n);	read(m);
	for(int i=1;i<=n;++i)
		read(p[i]);
	int a=0,b=inf,a0=1,b0=1,sum=m;
	for(int i=1;i<=n;++i)
	{
		if(Q.empty())
		{
			Q.push_back(i);
			num[p[i]]++;
			sum--;
		}
		else 
		{
			if(p[i]==p[Q.front()])
			{
				Q.push_back(i);
				num[p[i]]++;
				while(!Q.empty())	//实际上此时队列Q是不会空的,所以这里的循环标志可以改为别的,只要为1就行
				{
					num[p[Q.front()]]--;
					Q.pop_front();
					a0++;	//a0更新
					if(num[p[Q.front()]]==1)
						break;
				}
			}
			else
			{
				Q.push_back(i);
				if(!num[p[i]])	sum--;
				num[p[i]]++;
			}
		}
		b0=i;	//更新b0
		if(!sum)	//如果所以画家的作品都出现了,更新[a,b]
		{	
			if(b0-a0<b-a)	
			{
				b=b0;
				a=a0;
			}
			else if(b0-a0==b-a&&a0<a)
			{
				b=b0;
				a=a0;
			}
		}
	}
	cout<<a<<" "<<b<<endl;
	return 0;
}

PS:这道题一开始看还是有点懵逼的,后来手推了一遍样例就找到思路了。所以动动手,不要懒,或许有不一样的收获。


http://www.niftyadmin.cn/n/942917.html

相关文章

bzoj 2718: [Violet 4]毕业旅行

Description Input Output 最多可选多少景点 Sample Input 7 6 1 2 2 3 5 4 4 3 3 6 6 7 Sample Output 2 HINT Source Ctsc2008 River & ural 1533. Fat Hobbits 首先有个结论。。最小路径覆盖n-最大二分图匹配然后这题就没了。。。记得floyd处理下联通刚好练了一下网络流…

bzoj 1051: [HAOI2006]受欢迎的牛

Description 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛&#xff0c;给你M对整数(A,B)&#xff0c;表示牛A认为牛B受欢迎。 这种关系是具有传递性的&#xff0c;如果A认为B受欢迎&#xff0c;B认为C受欢迎&#xff0c;那么牛A也认为牛C受欢迎。你的任务是求出有多少…

The Preliminary Contest for ICPC Asia Xuzhou 2019,E(思维)

大致题意&#xff1a;有n个人&#xff0c;有n个数a[n]&#xff0c;a[i]表示第i个人的能力值&#xff0c;给定一个m&#xff0c;m为buff值&#xff0c;现在问你对于第i人(1<i<n)人的能力值加上buff后&#xff0c;找到最右边的能力值大于他的人的位置j&#xff0c;然后输出…

bzoj 3993: [Sdoi2015]星际战争

Description 3333年&#xff0c;在银河系的某星球上&#xff0c;X军团和Y军团正在激烈地作战。在战斗的某一阶段&#xff0c;Y军团一共派遣了N个巨型机器人进攻X军团的阵地&#xff0c;其中第i个巨型机器人的装甲值为Ai。当一个巨型机器人的装甲值减少到0或者以下时&#xff0c…

The Preliminary Contest for ICPC Asia Xuzhou 2019,K(贪心)

这道题当时没做出来比较可惜&#xff0c;当时发现这道题的时候已经有点晚了&#xff0c;后来跟别人交流了一下&#xff0c;感觉也不算难&#xff0c;要是早点发现的话可能是可以做出来的。 这道题看起来是有点难的样子&#xff0c;但其实是个纸老虎。 我们直接贪心枚举就可以了…

JSTSC2015第二轮省队选拔赛 后记

第二轮也结束了啊...考成这样还是感觉有点难受... 首先恭喜巷北 whx Loriex TKD进队。。不知自己最后会以什么类型的选手和你们在杭州见呢。。 DAY0&#xff1a; 试机的时候写了个tarjan&#xff0c;感觉状态还不错... DAY1&#xff1a; 首先看到了T1。发现题目都读不懂。…

洛谷P1714 切蛋糕(单调队列优化DP)

题意很清晰&#xff0c;就不多讲了。 我们不难想到可以用DP来做&#xff1a; dp[i]表示以第i块蛋糕为结尾时&#xff0c;所能获得的最大幸运值。 记sum[i]为1~i块蛋糕的幸运值的总和。则 状态转移方程&#xff1a;dp[i]sum[i]-min(sum[j]), i-m<j<i。 当ji的时候&#xf…

Codeforces Round #301 (Div. 2) A,B,C,D,E题解

最近状态极差...想用这套题练手结果B C都FST了... 一开始2分钟切掉A我还以为会很顺利... ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- A.C…