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 }
Problem Description
浙公网安备 33010602011771号