Approximating a Constant Range
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Approximating a Constant Range相关的知识,希望对你有一定的参考价值。
原题地址:http://codeforces.com/contest/602/problem/B
题意
给定一个序列,满足abs(a[i+1]-a[i])<=1
要求找到最长的一个子序列[l,r]满足序列中最大值max和最小值之差小于等于1
题解
要求找到题意要求的最长序列,对应的序列有什么特征呢?
假如序列起点终点是l,r,那么应该有abs(A[l-1]-A[r])==2
所以我们枚举终点,对应的起点可以用一个p数组O(1)维护和查询
同时,要求这个序列中A[r]-1和A[r]+1不能同时出现,也可以用p数组实现判断
p[x]:x出现的最后位置
也就是上一个x出现的下标
有的时候因为x过大的缘故,需要离散化或者用map代替数组实现这一功能
#include<bits/stdc++.h> using namespace std; const int maxn=1e5; int p[maxn+10]; int arr[maxn+5]; int main(void) { #ifdef ex1 freopen ("in.txt","r",stdin); #endif int n; scanf("%d",&n); for (int i=1;i<=n;++i) { scanf("%d",&arr[i]); } int ans=0; for (int i=1;i<=n;++i) { int x=arr[i]; p[x+2]=i; int k=max(p[x+4],p[x]); if (p[x+3]>k && p[x+1]>k) { ans=max(ans,i-min(p[x+3],p[x+1])); } else { ans=max(ans,i-k); } } printf("%d\n",ans); }
以上是关于Approximating a Constant Range的主要内容,如果未能解决你的问题,请参考以下文章
[Information Theory] L14: Approximating Probability Distributions (IV): Variational Methods
expected identifier before numeric constant