CodeForces 1321B. Journey Planning

传送门

题意

给数列 \(a_1,a_2,...,a_n\),要求找出子数列 \(a_{k_1},a_{k_2},...,a_{k_m}\),使子数列和最大,其中 \(a_{k_i}-a_{k_{i-1}}=k_i-k_{i-1}\),求最大和。

题解

这道题不会做,所有心态崩了看 Navi 暴捶 G2 去了。
其实 \(a_{k_i}-a_{k_{i-1}}=k_i-k_{i-1}\) 微微调整一下就是 \(a_{k_i}-k_i=a_{k_{i-1}}-k_{i-1}\)
可以发现同一个子数列中,值 \(-\) 下标相同
所以记录同一个差值的最大和就是答案了

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef long long LL;
const int MAXN=2e5+10;
const int MAXM=4e5+10;
int n,b[MAXN];
map<int,LL> mp;

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	LL ans=0;
	for(int i=1;i<=n;i++) mp[b[i]-i]+=b[i],ans=max(ans,mp[b[i]-i]);
	printf("%lld\n",ans);	
	return 0;
}
posted @ 2020-03-03 20:55  BakaCirno  阅读(129)  评论(0编辑  收藏  举报