游程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。游程编码因此而得名),使符号长度少于原始数据的长度。只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。
游程编码(Run Length Encoding , RLE)
例如:5555557777733322221111111
游程编码为:(5,6)(7,5)(3,3)(2,4)(1,7)
解题思路很好:
用value[i] count[i] 分别表示 第i段的数值 和 出现次数;
num[p] left[p] right[p]分别表示位置p所在段的编号和左右端点的位置。
每次查询(left,right)的结果为以下三个部分的最大值:从left到left所在段结束处的元素个数、从right所在段开始到right处的元素个数、中间第num[left]+1段到第num[right]-1段的count的最大值。
特殊情况:如果left和right在同一段中,答案是R-L+1。
解决方法如下:
#include
#include
#include
using namespace std; const int maxn = 100001; int n,q; int d[maxn][35]; int a[maxn]; int value[maxn],count_[maxn]; int num[maxn],left[maxn],right[maxn]; void RMQ_int(){ for(int i=0;i
num[right_]-1) ans=max(ans,0); else{ ans=max(ans,RMQ(num[left_]+1,num[right_]-1)); } } printf("%d\n",ans); } } return 0; }