96求调
查看原帖
96求调
1402162
wyh122345楼主2024/10/7 11:58

96分,大神求条

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	char ch=getchar();long long x=0, f=1;
	while(!isdigit(ch)) f=(ch=='-'?-1:f), ch=getchar();
	while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0', ch=getchar();
	return x*f;
}
inline void write(long long x)
{
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	write(x/10);
	putchar(x%10+'0');
}
long long n,t,ans1,ans2,ans;
long long r[200010],c[200010],pre[200010];
struct node{
	long long grade;
	long long con;
	long long nag;
}a[200010];
vector <node> vec;
bool cmp(node x,node y){
	if(x.nag==y.nag) return x.grade<y.grade;
	return x.nag>y.nag;
}
int main(){
	t=read();
	while(t--){
		ans=0;
		ans1=0;
		ans2=0;
		n=read();
		for(long long i=1;i<=n;i++){
			r[i]=read();
			a[i].grade=i;
		}
		for(long long i=1;i<=n;i++){
			c[i]=read();
			a[i].con=abs(c[i]);
			if(c[i]==a[i].con && c[i]!=0){
				a[i].nag=1;
			}else{
				a[i].nag=-1;
			}
		}
		sort(a+1,a+1+n,cmp);//将负数和0与正数分离
		long long pre=0;
		for(long long i=1;i<=n+1;i++){
			if(a[i].grade!=i){
				for(long long j=i-1;j>=1;j--){
					long long tmp=pre-a[j].con;
					pre+=a[j].con;
					ans1=max(tmp,ans1);
				}
				break;
			}
		}//给第一段正数排序
		pre=0;
		for(long long i=n;i>=0;i--){
			if(a[i].grade!=i){
				for(long long j=i+1;j<=n;j++){
					long long tmp=pre-a[j].con;
					pre+=a[j].con;
					ans2=max(tmp,ans2);
				}
				break;
			}
		}//给最后一段负数排序
		for(long long i=1;i<=n;i++){
			while(a[i].grade==i){
				i++;
			}
			ans+=a[i].con;
		}//算中间的贡献值
		ans+=ans1+ans2;
		write(ans);
		puts("");
	} 
	return 0;
}
2024/10/7 11:58
加载中...