欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【NOIP2015模拟10.30晚】中位数

程序员文章站 2022-03-05 14:24:54
思路分析可得,存在4种情况。第一种情况,如…001100……001100……001100…这种两个相同的数字组成的序列,我们不用进行任何操作。第二种情况,因为a[1]a[1]a[1]和a[n]a[n]a[n]不变,我们只需要在a[0]a[0]a[0]和a[n+1]a[n+1]a[n+1]处分别复制a[1]a[1]a[1]和a[n]a[n]a[n]的值即可。第三种情况,…0010101000……0010101000……0010101000…这种中间是101101101或010010010交替出现1,0...

思路

分析可得,存在4种情况。

第一种情况,如001100…001100…这种两个相同的数字组成的序列,我们不用进行任何操作。

第二种情况,因为a[1]a[1]a[n]a[n]不变,我们只需要在a[0]a[0]a[n+1]a[n+1]处分别复制a[1]a[1]a[n]a[n]的值即可。

第三种情况,0010101000…0010101000…这种中间是101101010010交替出现1,01,0的序列,交替序列两边是相同数字的情况,统计a[i]!=a[i+1]a[i]!=a[i+1]&&a[i]!=a[i1]a[i]!=a[i-1]的连续的ii的次数为numnum,则ans+=(num+1)/2ans+=(num+1)/2,新序列中原交替序列部分和两边的数字相同,如该例子得到的结果是0000000000…0000000000…

第四种情况,00010101111…00010101111…这种中间是101101010010交替出现的序列,交替序列两边是不同数字的情况,统计a[i]!=a[i+1]a[i]!=a[i+1]&&a[i]!=a[i1]a[i]!=a[i-1]的连续的ii的次数为numnum,则ans+=num/2ans+=num/2,因为numnum恒为偶数,为了方便,下面的代码写的是ans+=(num+1)/2ans+=(num+1)/2,新序列中原交替部分前一半和交替序列左边的数字相同,后一半和交替序列右边的数字相同,如该例子得到的结果是00000111111…00000111111…

code

#include<bits/stdc++.h>
#define ll long long
#define R register
#define mod 1000000007
using namespace std;
inline ll read(){
	ll f=0,pa=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')pa=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){f=(f<<3)+(f<<1)+(ch^48);ch=getchar();}
	return f*pa;
}
inline void write(ll x){
	if(x<0)x=-x,putchar('-');
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
inline void writelp(ll x){write(x);putchar(' ');}
inline void writeln(ll x){write(x);putchar('\n');}
ll n,a[500005],ans,b[500005],s,e,scnt,ecnt,num;
int main(){
	freopen("median.in","r",stdin);
	freopen("median.out","w",stdout);
	n=read();
	for(R ll i=1;i<=n;i++) a[i]=read();
	a[0]=a[1];a[n+1]=a[n];
	for(R ll i=1;i<=n;i++){
		if(a[i]==a[i-1]||a[i]==a[i+1]){
			b[i]=a[i];
			if(scnt){
				e=a[i];ecnt=i-1;
				if(s==e){
					for(R ll j=scnt;j<=ecnt;j++)
					b[j]=s;
				}else{
					for(R ll j=scnt;j<=(scnt+ecnt)/2;j++)
					b[j]=s;
					for(R ll j=(scnt+ecnt)/2+1;j<=ecnt;j++)
					b[j]=e;
				}
				ans=max(ans,(num+1)/2);
				s=0;e=0;scnt=0;ecnt=0;num=0;
			}
		}
		else{
			if(!scnt) s=a[i-1],scnt=i;
			num++;
		}
	}
	writeln(ans);
	for(R ll i=1;i<=n;i++)
	writelp(b[i]);
	return 0;
}

本文地址:https://blog.csdn.net/auroralbeauty/article/details/107610836

相关标签: 题解