求助
查看原帖
求助
716099
lovely_hyzhuo楼主2024/1/10 19:55
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r;
	int sum;
	int lazy;
}tr[1000010];
int a[1000010];
int h[1000010],f[10000010];
void push_up(int p)
{
	tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
void push_down(int p)
{
	if(tr[p].lazy==0)
		return;
	tr[p*2].sum+=tr[p].lazy*(tr[p*2].r-tr[p*2].l+1);
	tr[p*2+1].sum+=tr[p].lazy*(tr[p*2+1].r-tr[p*2+1].l+1);
	tr[p*2].lazy+=tr[p].lazy;
	tr[p*2+1].lazy+=tr[p].lazy;
	tr[p].lazy=0;
}
void build(int l,int r,int p)
{
	tr[p].l=l,tr[p].r=r;
	if(l==r)
		return;
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	push_up(p);
}
void update(int l,int r,int k,int p)
{
	if(tr[p].l>=l&&tr[p].r<=r)
	{
		tr[p].sum+=k*(tr[p].r-tr[p].l+1);
		tr[p].lazy+=k;
		return;
	}
	push_down(p);
	int mid=(tr[p].l+tr[p].r)/2;
	if(mid>=l)
		update(l,r,k,p*2);
	if(mid<r)
		update(l,r,k,p*2+1);
	push_up(p);
}
int query(int l,int r,int p)
{
	if(tr[p].l>=l&&tr[p].r<=r)
		return tr[p].sum;
	push_down(p);
	int mid=(tr[p].l+tr[p].r)/2,sum=0;
	if(mid>=l)
		sum+=query(l,r,p*2);
	if(mid<r)
		sum+=query(l,r,p*2+1);
	return sum;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>h[i];
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=n;i++)
	{
		int t=query(1,h[i],1);
		f[i]=t+a[i];
		update(h[i],h[i],f[i],1);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
		ans=max(ans,f[i]);
	cout<<ans;
	return 0;
}

WA样例3

2024/1/10 19:55
加载中...