关于今晚CF的D
  • 板块学术版
  • 楼主JS_TZ_ZHR
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/5 00:57
  • 上次更新2023/10/27 21:51:51
查看原帖
关于今晚CF的D
200044
JS_TZ_ZHR楼主2022/7/5 00:57

枚举最后剩下来的数贪心做,求个hack数据

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define N 1000005 
#define mod 1000000007 
#define int long long
using namespace std;
int T,n,a[N],ans,sum,l[N],r[N],cnt,tot[N],mx,num,tmp,mxp,lst;
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++)cin>>a[i];
		a[n+1]=0;
		ans=0;
		
		for(int i=1;i<=n;i++){
			sum=0;
			cnt=0;
			for(int j=1;j<=n;j++){
				if(a[j]==i&&a[j-1]!=i)l[++cnt]=j;
				if(a[j]==i&&a[j+1]!=i)r[cnt]=j;
			}
			lst=0;
			l[++cnt]=n+1,r[cnt]=n;
			for(int j=1;j<=cnt;j++){
				mx=num=0;
				if(lst>=r[j])continue;
				else if(lst>=l[j]){
					sum=sum+r[j]-lst;
					continue;
				}
				for(int k=lst+1;k<=l[j]-1;k++){
					tot[a[k]]++;
					num++;
					if(tot[a[k]]>mx)mxp=a[k];
					mx=max(mx,tot[a[k]]);
				} 
				for(int k=lst+1;k<=l[j]-1;k++)tot[a[k]]=0;
				if(mx<=(num+1)/2)sum+=(r[j]-l[j]+1-(num&1)),lst=r[j];
				else{
					mx=mx-(num-mx);
					tmp=l[j]-1;
					while(tmp<n&&mx){
						tmp++;
						if(a[tmp]==mxp)mx++;
						else mx--;
					}
					if(mx)sum-=mx;
					lst=tmp;
					if(tmp<=r[j])sum+=r[j]-tmp,lst=r[j];
				}
			}
			ans=max(ans,sum);
		}
		cout<<ans<<endl;
	}
	
}

2022/7/5 00:57
加载中...