或者给这份代码一个 hack
#include<bits/stdc++.h>
using namespace std;int t,r,c[200005],n,p[200005],cnt1,cnt2;long long ans,tmp1,tmp2,q1[200005],q2[200005];
bool cmp(int x,int y)
{
if(c[x] > 0 && c[y] > 0 || c[x] < 0 && c[y] < 0) return x < y;
return c[x] > c[y];
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
for(cin >> t;t;--t)
{
cin >> n;ans = cnt1 = cnt2 = tmp1 = tmp2 = 0;
for(int i(1);i <= n;++i) cin >> r,p[i] = i;
for(int i(1);i <= n;++i) cin >> c[i];
sort(p+1,p+1+n,cmp);
for(int i(1);i <= n;++i)
{
if(p[i] > i) ans += c[p[i]];
else if(p[i] < i) ans -= c[p[i]];
else if(c[p[i]] > 0) q1[++cnt1] = q1[cnt1]+c[p[i]];
else if(c[p[i]] < 0) q2[++cnt2] = q2[cnt2]+c[p[i]];
}
int i(1);
if(cnt1 >= 2) for(int j(1);i <= n && (j^cnt1);++i) if(!(p[i]^i) && c[p[i]] > 0) tmp1 = max(tmp1,q1[cnt1]-q1[j]-c[p[i]]),++j;
if(cnt2 >= 2) for(int j(1);i <= n && (j^cnt2);++i) if(!(p[i]^i) && c[p[i]] < 0) tmp2 = max(tmp2,q2[j]+c[p[i]]-q2[cnt2]),++j;
cout << ans+tmp1+tmp2 << "\n";
}
}
感谢!