16pts 求dalao调
真的服了,贪心的题基本没对过。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5+10;
ll T,n,ans,used[N];
struct lz
{
ll c,r,id;
}a[N];
bool cmp1(lz a,lz b)
{
return a.r>b.r;
}
bool cmp2(lz a,lz b)
{
if(abs(a.c)==abs(b.c))
{
if(a.c>=0 and b.c>=0)
return a.r>b.r;
if(a.c<0 and b.c<0)
return a.r<b.r;
// if(a.c>b.c)
// return 0;
// if(a.c<b.c)
// return 1;
}
return abs(a.c)>abs(b.c);
}
ll read()
{
ll x=0,f=1;
char c=getchar();
while(c<'0' or c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0' and c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int main()
{
// freopen("contrib2.in","r",stdin);
// freopen("contrib.out","w",stdout);
T=read();
for(register int l=1;l<=T;l++)
{
memset(a,0,sizeof(a));
memset(used,0,sizeof(used));
ans=0;
n=read();
for(register int i=1;i<=n;i++)
{
a[i].r=read();
a[i].id=i;
}
sort(a+1,a+n+1,cmp1);
for(register int i=1;i<=n;i++)
a[i].r=i;
for(register int i=1;i<=n;i++)
a[i].c=read();
sort(a+1,a+n+1,cmp2);
// for(register int i=1;i<=n;i++)
// {
// cout<<a[i].r<<' '<<a[i].c<<'\n';
// }
for(register int i=1;i<=n;i++)
{
if(a[i].c==0)
continue;
if(a[i].c<0)
{
ll t=a[i].r+1,tot=0;
if(t==n and !used[n])
{
used[n]=a[i].r;
continue;
}
while(used[t]!=0 and t<=n)
{
++t;
++tot;
}
if(tot==n-a[i].r)
{
if(!used[a[i].r])
continue;
ans+=a[i].c;
continue;
}
used[t]=a[i].r;
ans-=a[i].c;
continue;
}
if(a[i].c>0)
{
ll t=a[i].r-1,tot=0;
if(t==0 and !used[1])
{
used[1]=a[i].r;
continue;
}
while(used[t]!=0 and t>=1)
{
--t;
++tot;
}
if(tot==a[i].r-1)
{
if(!used[a[i].r])
continue;
ans-=a[i].c;
continue;
}
used[t]=a[i].r;
ans+=a[i].c;
continue;
}
}
// for(register int i=1;i<=n;i++)
// cout<<used[i]<<' ';
// cout<<'\n';
cout<<ans<<'\n';
}
}