贪心32pts求助
查看原帖
贪心32pts求助
400468
Aakkosetsumussa楼主2023/10/17 17:12
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1000005;
ll T, n;
struct node {
	ll r, c, a, b;
} e[maxn];
node qn[maxn], qx[maxn];
node qqn[maxn], qqx[maxn];
ll qqnsum[maxn], qqxsum[maxn];

bool cmp(node x, node y) {
	return x.r>y.r;
}

void work() {

	memset(e, 0, sizeof e);
	memset(qn, 0, sizeof qn);
	memset(qx, 0, sizeof qx);
	memset(qqn, 0, sizeof qqn);
	memset(qqx, 0, sizeof qqx);
	memset(qqnsum, 0, sizeof qqnsum);
	memset(qqxsum, 0, sizeof qqxsum);

	scanf("%lld", &n);
	for(ll i=1; i<=n; i++)
		scanf("%lld", &e[i].r);
	for(ll i=1; i<=n; i++)
		scanf("%lld", &e[i].c);
	for(ll i=1; i<=n; i++) e[i].a=i;

	ll pn=0, px=0, ans=0;
	for(ll i=1; i<=n; i++) {
		if(e[i].c<=0) pn++, qn[pn]=e[i];
		else px++, qx[px]=e[i];
	}


	ll ppn=0, ppx=0;
	for(ll i=1; i<=pn; i++) {
		if(qn[i].a<i+px) ans-=qn[i].c;
		else ppn++, qqn[ppn]=qn[i];
	}

	for(ll i=1; i<=px; i++) {
		if(qx[i].a>i) ans+=qx[i].c;
		else ppx++, qqx[ppx]=qx[i];
	}

	//printf("%lld\n", ans);

	for(ll i=1; i<=ppn; i++) {
		qqnsum[i]=qqnsum[i-1]+qqn[i].c;
		//cout<<qqn[i].c<<" "<<qqnsum[i]<<endl;
	}
	//cout<<endl;
	for(ll i=1; i<=ppx; i++) {
		qqxsum[i]=qqxsum[i-1]+qqx[i].c;
		//cout<<qqx[i].c<<" "<<qqxsum[i]<<endl;
	}
	//cout<<endl;

	ll sum1=0, sum2=0;
	for(ll i=1; i<=ppn; i++) {
		sum1=max(sum1, qqnsum[ppn]-qqnsum[i]-qqn[i].c);
	}
	for(ll i=1; i<=ppx; i++) {
		sum2=max(sum2, qqxsum[ppx]-qqxsum[i]-qqx[i].c);
	}

	ans+=sum1+sum2;

	printf("%lld\n", ans);
	//cout<<endl;
}

int main() {

//	freopen("contrib3.in", "r", stdin);
//	freopen("contrib3.out", "w", stdout);

	scanf("%lld", &T);
	while(T--) work();
	return 0;
}
//113010263+2477233798334

本来以为贪心不行,但是看到有贪心过的,求调

2023/10/17 17:12
加载中...