POJ2796Feel Good(DP)

//对与某个数来说,他在某个区间内取到他自己是最小的区间,dp区间记录下来
//这里要用到栈的思想,假设我第i个处理好了,那么在i和k之间的比i大的显然都不需要考虑包括i前面的比i大的也不需要考虑
//这题很直观的做法是2分区间,rmq查询最小貌似会超时

下面是我的代码(是用栈的方法写的)

#include using namespace std; int a[100005]; __int64 num[100005]; int l[100005],r[100005]; int s[100005]; int len; int n; int main() { int i,j,k,t,id; __int64 sum,temp; while(scanf("%d",&n)!=EOF) { num[0]=0; for(i=1;i<=n;i++)//处理完累和 { scanf("%d",&a[i]); num[i]=num[i-1]+a[i]; //cout<=a[i])len--;//相当于出栈 l[i]=s[len-1]+1; s[len++]=i; } r[n]=n; a[n+1]=-1; s[1]=n; s[0]=n+1; len=2; for(i=n-1;i>0;i--) { while(a[s[len-1]]>=a[i])len--; r[i]=s[len-1]-1; s[len++]=i; } /*for(i=1;i<=n;i++) { cout<<"a["<

你可能感兴趣的:(ACM)