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;
}