60,bzd怎么WA+TLE
查看原帖
60,bzd怎么WA+TLE
1394370
Listedzero楼主2025/7/22 13:25
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,a[N],b[N],tp[N],dw[N],n1,n2,ans[N];
int istp,isdw;
bool use[N];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	sort(b+1,b+1+n);
	if(a[1]<a[2]) dw[++n2]=1,isdw++;
	else tp[++n1]=1,istp++;
	for(int i=2;i<n;i++){
		if(a[i-1]<a[i]&&a[i]>a[i+1]) tp[++n1]=i;
		if(a[i-1]>a[i]&&a[i]<a[i+1]) dw[++n2]=i;
	}
	if(a[n-1]<a[n]) tp[++n1]=n,istp++;
	else dw[++n2]=n,isdw++;
	int r=n,l=1;
	for(int i=1;i<=n;i++){
		if(i==1){
			if(a[1]>a[2]) ans[1]=b[n-n1+1];
			if(a[1]<a[2]) ans[1]=b[n2];
			continue;
		}
		if(i==n){
			if(a[n-1]>a[n]&&isdw==1) ans[n]=b[n2];
			if(a[n-1]>a[n]&&isdw==2) ans[n]=b[n2-1];
			if(a[n-1]<a[n]&&istp==1) ans[n]=b[n-n1+1];
			if(a[n-1]<a[n]&&istp==2) ans[n]=b[n-n1];
			continue;
		}	
		if(a[i-1]<a[i]&&a[i]>a[i+1]) ans[i]=b[r--];
		if(a[i-1]>a[i]&&a[i]<a[i+1]) ans[i]=b[l++];
	}
	//上面这段:记录极值 
	for(int i=2;i<n;){
		if(!ans[i]){
			int l=i-1,r=i+1;
			while(!ans[r]) r++;
			while(!ans[l]) l--;
			int minn,maxn;
			maxn=ans[l],minn=ans[r];
			if(minn>maxn) swap(minn,maxn);
			bool s=0;
			if(ans[l]<ans[r]) s=1;
			int st;
			if(s){
				for(int k=n1+1;k<=n-n2;k++)
				if(!use[k]&&minn<b[k]&&b[k]<maxn){
					st=k;
					break;
				}
				for(int k=1;k<=r-l-1;k++)
					ans[l+k]=b[st+k-1],use[st+k-1]=1;
				i=r+1;
			}
			if(!s){
				for(int k=n-n2;k>=n1+1;k--)
				if(!use[k]&&minn<b[k]&&b[k]<maxn){
					st=k;
					break;
				}
				for(int k=1;k<=r-l-1;k++)
					ans[l+k]=b[st-k+1],use[st-k+1]=1;
				i=r+1;
			}
		}
	}
	//上面这段:往里面填值 
	int sum=0;
	for(int i=2;i<=n;i++) sum+=abs(ans[i]-ans[i-1]);
	cout<<sum<<'\n'; 
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	return 0;
}
2025/7/22 13:25
加载中...