AT_dp_q Flowers题解

题目描述

有 N 朵花排成一排。对于每个 i(1≤i≤N),从左往右第 i 朵花的高度为 hi​,美丽值为 ai​。其中 h1​,h2​,…,hN​ 互不相同。

太郎君想通过拔掉一些花,使得剩下的花满足以下条件:

  • 从左到右看,剩下的花的高度严格递增。

请你求出剩下的花的美丽值总和的最大值。

输入格式

输入以如下格式从标准输入读入:

N
h1​ h2​ … hN​
a1​ a2​ … aN​

输出格式

请输出剩下的花的美丽值总和的最大值。

显示翻译

题意翻译

输入输出样例

输入 #1复制

4
3 1 4 2
10 20 30 40

输出 #1复制

60

输入 #2复制

1
1
10

输出 #2复制

10

输入 #3复制

5
1 2 3 4 5
1000000000 1000000000 1000000000 1000000000 1000000000

输出 #3复制

5000000000

输入 #4复制

9
4 2 5 8 3 6 1 7 9
6 8 8 4 6 3 5 7 5

输出 #4复制

31

说明/提示

限制条件

  • 所有输入均为整数。
  • 1≤N≤2×105
  • 1≤hi​≤N
  • h1​,h2​,…,hN​ 互不相同。
  • 1≤ai​≤109

样例解释 1

保留从左到右第 2、4 朵花即可。此时高度依次为 1,2,满足严格递增。美丽值总和为 20+40=60。

样例解释 2

一开始就已经满足条件。

样例解释 3

答案可能超出 32 位整数范围。

样例解释 4

保留从左到右第 2、3、6、8、9 朵花即可。

由 ChatGPT 4.1 翻译

思路

DP即可。

代码见下

#include<bits/stdc++.h> 
using namespace std;
long long n,h[200005],a[200005];
long long a2[200005],u,x,y,k,f[200005],lk=0,kl=0;
long long lb(long long x){
    return x&(-x);
}
void ci(long long x,long long d){
    while(x<=n){
        a2[x]=max(a2[x],d);
        x+=lb(x);
    }
}
long long co(long long x){
    long long lks=0;
    while(x>=1){
        lks=max(lks,a2[x]);
        x-=lb(x);
    }
    return lks;
}
int main(){
	cin>>n;
    for(int i=1;i<=n;i++){
        cin>>h[i];
    }
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        f[i]=co(h[i]-1)+a[i];
        ci(h[i],f[i]);
        lk=max(lk,f[i]);
    }
    cout<<lk<<endl;
	return 0;
}

posted @ 2025-10-23 10:25  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源