FOJ 2136

 Problem 2136 取糖果

Accept: 89    Submit: 221
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

有N个袋子放成一排,每个袋子里有一定数量的糖果,lzs会随机选择连续的几个袋子,然后拿走这些袋子中包含最多糖果的袋子。现问你,在选择x个袋子的情况下,lzs最坏情况下,也就是最少会拿到多少个糖果?对于x取值为1到n都分别输出答案。

 Input

第一行一个整数T,表示有T组数据。

 

每组数据先输入一行一个整数N(1<=N<=100000),表示袋子数,接下来一行输入N个正整数,输入的第i个数表示第i个袋子所装的糖果数。

 Output

每组数据输出n行,第i行表示lzs随机取连续的i个袋子时的最坏情况下能拿到的糖果数。

 Sample Input

1 5 1 3 2 4 5

 Sample Output

1 3 3 4 5
 
 
 
 
 
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <queue>
  5 #include <stack>
  6 #include <string>
  7 #include <cstring>
  8 #define lson id<<1,l,m
  9 #define rson id<<1|1,m+1,r
 10 using namespace std;
 11 typedef long long ll;
 12 const int maxn=100000+1000;
 13 const int inf=(1<<30);
 14 struct segmenttree
 15 {
 16     int dt[maxn<<2];
 17     void pushup(int id)
 18     {
 19         dt[id]=min(dt[id<<1],dt[id<<1|1]);
 20     }
 21     void build(int id,int l,int r)
 22     {
 23         if (l==r)
 24         {
 25             dt[id]=inf;
 26             return;
 27         }
 28         int m=(l+r)>>1;
 29         build(lson);
 30         build(rson);
 31         pushup(id);
 32     }
 33     void modify(int L,int R,int id,int l,int r,int c)
 34     {
 35         if (L==l && R==r)
 36         {
 37             dt[id]=min(dt[id],c);
 38             return;
 39         }
 40         int m=(l+r)>>1;
 41         if (R<=m) modify(L,R,lson,c);
 42         else if (L>m) modify(L,R,rson,c);
 43         else modify(L,m,lson,c),modify(m+1,R,rson,c);
 44     }
 45     int query(int pos,int id,int l,int r)
 46     {
 47         if (l==r) return dt[id];
 48         int res=dt[id];
 49         int m=(l+r)>>1;
 50         if (pos<=m) return min(res,query(pos,lson));
 51         else return min(res,query(pos,rson));
 52     }
 53 }sgt;
 54 int a[maxn],b[maxn];
 55 int l[maxn],r[maxn];
 56 int tt,n,m;
 57 int main()
 58 {
 59     scanf("%d",&tt);
 60     while(tt--)
 61     {
 62         scanf("%d",&n);
 63         for (int i=1; i<=n; i++)
 64             scanf("%d",&a[i]);
 65         memset(l,0,sizeof l);
 66         memset(r,0,sizeof r);
 67         for (int i=1; i<=n; i++)
 68         {
 69             l[i]=i;
 70             int j=i-1;
 71             while (a[j]<=a[i] && j>=1)
 72             {
 73 
 74                 l[i]=l[j];
 75                 j=l[j]-1;
 76             }
 77         }
 78         for (int i=n; i>=1; i--)
 79         {
 80             r[i]=i;
 81             int j=i+1;
 82             while (a[j]<=a[i] && j<=n)
 83             {
 84                 r[i]=r[j];
 85                 j=r[j]+1;
 86             }
 87         }
 88         sgt.build(1,1,n);
 89         for (int i=1; i<=n; i++)
 90         {
 91             int len=(r[i]-l[i]+1);
 92             sgt.modify(1,len,1,1,n,a[i]);
 93         }
 94         for (int i=1; i<=n; i++)
 95         {
 96             cout<<sgt.query(i,1,1,n)<<endl;
 97         }
 98     }
 99     return 0;
100 }
View Code

 

posted on 2013-12-11 19:29  看见的是....  阅读(149)  评论(0)    收藏  举报