zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);
    83         }
    84     }
    85     return 0;
    86 }
    fzu2136
  • 相关阅读:
    启发式搜索学习~~
    bzoj1032
    bzoj1037
    bzoj1029
    codevs1081 线段树练习 2
    bzoj1006
    bzoj1003
    Codeforces 607B Zuma
    20155326《网络对抗》网络欺诈技术防范
    20155326刘美岑 Exp6 信息收集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/wonderzy/p/3418312.html
Copyright © 2011-2022 走看看