FZU2136 取糖果

貌似人家都是用链表过的,我太弱了,只会用线段树,排最后了,还好1A了。。。。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int t,n;
 6 int dp[100010];
 7 struct tree{
 8     int l,r;
 9     int ans,lans,rans;       
10 }a[400010];
11 struct point{
12     int v,x;
13 }p[100010];
14 int ans[100010];
15 void build(int l,int r,int k){
16     a[k].l=l,a[k].r=r;
17     a[k].ans=a[k].lans=a[k].rans=r-l+1;
18     if(l!=r){
19        int mid=(l+r)>>1;
20        build(l,mid,k<<1);
21        build(mid+1,r,k<<1|1);
22     }
23 }
24 void pushup(int k){
25     a[k].ans=max(max(a[k<<1].ans,a[k<<1|1].ans),a[k<<1].rans+a[k<<1|1].lans);
26     a[k].lans=a[k<<1].lans;
27     if(a[k<<1].lans==a[k<<1].r-a[k<<1].l+1) a[k].lans+=a[k<<1|1].lans;
28     a[k].rans=a[k<<1|1].rans;
29     if(a[k<<1|1].rans==a[k<<1|1].r-a[k<<1|1].l+1) a[k].rans+=a[k<<1].rans;
30 }
31 void add(int x,int k){
32     if(a[k].l==a[k].r){
33        a[k].ans=a[k].lans=a[k].rans=0;
34        return;
35     }
36     int mid=(a[k].l+a[k].r)>>1;
37     if(x<=mid) add(x,k<<1);
38     else add(x,k<<1|1);
39     pushup(k);
40 }
41 int query(int l,int r,int k){
42     if(l<=a[k].l&&a[k].r<=r){
43        return a[k].ans;
44     }else{
45        int mid=(a[k].l+a[k].r)>>1;
46        if(r<=mid) return query(l,r,k<<1);
47        else if(l>mid) return query(l,r,k<<1|1);
48        else{
49            int ll=query(l,mid,k<<1),rr=query(mid+1,r,k<<1|1);
50            int l1,r1;
51            if(mid-l+1>=a[k<<1].rans) l1=a[k<<1].rans;
52            else l1=mid-l+1;
53            if(r-mid>=a[k<<1|1].lans) r1=a[k<<1|1].lans;
54            else r1=r-mid;
55            return max(max(ll,rr),l1+r1);
56        }
57     }
58 }
59 int cmp(point a,point b){
60     return a.v>b.v;
61 }
62 int main(){
63     scanf("%d",&t);
64     while(t--){
65         scanf("%d",&n);
66         build(1,n,1);
67         for(int i=1;i<=n;i++){
68            scanf("%d",&p[i].v);
69            p[i].x=i;
70         }
71         sort(p+1,p+1+n,cmp);
72         for(int i=1,j=n;i<=n&&j>=1;i++){
73            add(p[i].x,1);
74            //cout<<p[i].x<<" "<<p[i].v<<" "<<j<<endl;
75            while(j>=1&&(p[i].x-j<1||(p[i].x-j>=1&&query(1,p[i].x-1,1)<j))
76                 &&(p[i].x+j>n||(p[i].x+j<=n&&query(p[i].x+1,n,1)<j))){
77                   ans[j--]=p[i].v;
78                   //cout<<j+1<<"="<<p[i].v<<endl;
79            }
80         }
81         for(int i=1;i<=n;i++){
82             printf("%d\n",ans[i]);
83         }
84     }
85     return 0;
86 }
fzu2136
posted @ 2013-11-11 18:21  wonderzy  阅读(198)  评论(0编辑  收藏  举报