怎么贪啊
查看原帖
怎么贪啊
678358
sdsy1532楼主2023/10/15 20:04

16pts 求dalao调

真的服了,贪心的题基本没对过。

16pts测试点详情

#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';
	}		
}
2023/10/15 20:04
加载中...