列表

详情


NC50961. dfs入门

描述

xyq来到了一个大市场,他现在n个商品中按顺序购买一些商品,每个商品的价值都在[1,m]之间,问题是他是个很精打细算的人,假如你当前买的价值是a,那么你接下来的物品都不能超过a,他现在想知道他买的物品的价值之和最大是多少?请你帮棒他。

输入描述

第一行包含两个整数表示物品数,M表示商品价值区间。

第二行包含N个整数,第i个整数k表示第i个物品的价值,

输出描述

输出包含1个整数,表示答案。

示例1

输入:

1 1

1

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 71ms, 内存消耗: 4224K, 提交时间: 2021-01-30 20:49:42

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=2e5+10;
int n,m;
int a[maxn];
ll f[maxn];
ll tr[maxn];
void add(int x,ll k)
{
	while(x<=2e5)
	{
		tr[x]=max(tr[x],k);
		x+=x&-x;
	}
 }
ll dor(int x)
{
	ll ret=0;
	while(x)
	{
		ret=max(ret,tr[x]);
		x-=x&-x;
	}
	return ret;
}
int main()
{
    
    
    
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	ll ans=0;
	for(int i=n;i>=1;i--)
	{
		f[i]=a[i];
		f[i]=max(f[i],a[i]+dor(a[i]));
		add(a[i],f[i]);
		ans=max(f[i],ans);
	}
	cout<<ans<<endl;
	return 0;
}

上一题