貌似人家都是用链表过的,我太弱了,只会用线段树,排最后了,还好1A了。。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ",ans[i]); 83 } 84 } 85 return 0; 86 }