摘要:
该题的题意是给你一个数字字符串,要你在其中抽去n个数字所组成的数字最小。这个题可以从反方向出发,我们可以从中抽取字符串长度(len)减去n组成最小的数字;我们知道要想最小第一个数前面一定没有比他大,也就是我们可以从0-(len-n-1)里面找最小的,找到之后,再从找到第一个数的位置后一个找第二个,以此类推。再结合RMQ就可以了。#include<iostream>#include<cstdio>#include<cmath>#include<string>#include<string.h>using namespace std;in 阅读全文
posted @ 2012-01-06 21:15
wutaoKeen
阅读(350)
评论(0)
推荐(0)
摘要:
#include<iostream>#include<cstdlib>#include<cmath>#include<cstdio>#include<string.h>using namespace std;int num[50024],dp_min[20][50024],dp_max[20][50024];inline int min( int a,int b ){ return a>b?b:a; }inline int max( int a,int b ){ return a>b?a:b; }void get_RMQ( 阅读全文
posted @ 2012-01-06 12:11
wutaoKeen
阅读(206)
评论(0)
推荐(0)
摘要:
该题是一道RMQ+二分RMQ(RangeMinimum/MaximumQuery)问题是求区间最值问题。你当然可以写个O(n)的(怎么写都可以吧=_=),但是万一要询问最值1000000遍,估计你就要挂了。这时候你可以放心地写一个线段树(前提是不写错)O(logn)的复杂度应该不会挂。但是,这里有更牛的算法,就是ST算法,它可以做到O(nlogn)的预处理,O(1)!!!地回答每个询问。 来看一下ST算法是怎么实现的(以最大值为例): 首先是预处理,用一个DP解决。设a是要求区间最值的数列,f表示从第i个数起连续2^j个数中的最大值。例如数列3245681297,f[1,0]表示第1个数起.. 阅读全文
posted @ 2012-01-06 12:02
wutaoKeen
阅读(611)
评论(0)
推荐(0)

浙公网安备 33010602011771号