社区讨论

超时求助

题目总版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjh0tzu
此快照首次捕获于
2025/11/04 02:25
4 个月前
此快照最后确认于
2025/11/04 02:25
4 个月前
查看原帖
题目是刚才MXJ组C题。
我已经拿出毕生所学(归并排序+DP(有些抽象)+快读)了,还是没成功,求助。
CPP
#include<bits/stdc++.h>
using namespace std;
int n,a[5000005],b[5000005],c[5000005],d[5000005],dp,ans,maxx,sum;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void guibing(int l,int r){
	if(l==r)return;
	int mid=(l+r)/2;
	guibing(l,mid);
	guibing(mid+1,r);
	int ll=l,mm=mid+1,tot=l,top=0;
    for(int i=l;i<=r;i++){
		d[i]=0;
	}
	while(ll<=mid&&mm<=r){
		if(a[ll]>a[mm]){
			b[a[mm]]=b[a[mm]]+mid-ll+1;
			top++;
			d[tot++]=a[mm];
			mm++;
		}
		else{
			d[tot++]=a[ll];
			b[a[ll]]+=top;
			ll++;
		}
	}
	while(ll<=mid){
		d[tot++]=a[ll];
		b[a[ll]]+=top;
		ll++;
	}
	while(mm<=r){
		d[tot++]=a[mm];
		mm++;
	}
	for(int i=l;i<=r;i++){
		a[i]=d[i];
	}
}
int main(){
	int t;
	t=read();
	while(t--){
		ans=maxx=sum=dp=0;
		n=read();
		for(int i=1;i<=n;i++){
			a[i]=read();
			c[i]=a[i];
		}
		guibing(1,n);
		for(int i=1;i<=n;i++){
			c[i]=b[c[i]];
            c[i]%=2;
			if(c[i]){
				ans++;
				if(sum-1>0){sum--;dp++;}
				else sum=dp=0;
			}
			else{sum++;dp++;}
			if(dp%2==0)maxx=max(maxx,sum);
		}
		if(dp%2==0)maxx=max(maxx,sum);
		ans+=maxx;
		printf("%lld\n",ans);
        for(int i=1;i<=n;i++){
			a[i]=b[i]=c[i]=d[i]=0;
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...