社区讨论
超时求助
题目总版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjh0tzu
- 此快照首次捕获于
- 2025/11/04 02:25 4 个月前
- 此快照最后确认于
- 2025/11/04 02:25 4 个月前
题目是刚才MXJ组C题。
我已经拿出毕生所学(归并排序+DP(有些抽象)+快读)了,还是没成功,求助。
CPP我已经拿出毕生所学(归并排序+DP(有些抽象)+快读)了,还是没成功,求助。
#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 条回复,欢迎继续交流。
正在加载回复...