MnZn 求 Hack abc D
  • 板块学术版
  • 楼主DATA_joel
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/11/22 21:50
  • 上次更新2024/11/23 08:51:09
查看原帖
MnZn 求 Hack abc D
420651
DATA_joel楼主2024/11/22 21:50

rt, 整场爆炸, 下方所有记录均 WA 5.

最后一次提交

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double Lf;
typedef double lf;
const ll N=5e6+5;
ll n,a[N];
queue<ll> Q;
ll b[N],m=0,ans=0;
bool I[N];
int main()
{
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	ll lst=-1;
	for(ll i=1;i<=n;i++)
	{
		if(a[i]==lst)
		{
			b[m]=a[i];
			lst=-1;
		}
		else
		{
			b[++m]=-1;
			lst=a[i];
		}
	}
	for(ll i=1;i<=m;i++)
	{
		if(b[i]==-1)
		{
			while(!Q.empty())
			{
				I[Q.front()]=false;
				Q.pop();
			}
			ans=max(ans,(ll)Q.size());
			continue;
		}
		ans=max(ans,(ll)Q.size());
		while(I[b[i]]==true)
		{
			I[Q.front()]=false;
			Q.pop();
		}
		I[b[i]]=true;
		Q.push(b[i]);
		ans=max(ans,(ll)Q.size());
	}
	printf("%lld\n",ans*2);
}

大致思路: 把相邻的相同元素两两缩成一个, 剩下落单的替换为 -1, 对处理后的序列 O(n)O(n) 扫一遍, 把遇到的元素加到队列尾部, 不断出队直到队中没有相同元素.

挂了还是假了? 一直WA5, 从头到尾.

2024/11/22 21:50
加载中...