购物

二分 考场上想到了来着 被后面搜索劝退

ll cnt,b[N<<1];
bool check(ll mid){
    cnt=b[b[0]=1]=0;
    for(int i=1;i<=n;++i) {
        while(b[0]&&b[b[0]]+a[i]>mid) --b[0];
        if(!b[0]) return 0;
        for(int j=1;j<=b[0];++j) b[j+b[0]]=a[i]+b[j],++cnt;b[0]<<=1;
        if(cnt>=K) return 1;
        sort(b+1,b+b[0]+1);
    }
    return 0;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    rd(n),rd(K);
    for(int i=1;i<=n;++i) rd(a[i]),sum+=a[i];
    sort(a+1,a+1+n);
    ll l=1,r=sum,ans,mid;
    while(l<=r){
        mid=l+r>>1;
        if(check(mid)) ans=mid,r=mid-1;
        else l=mid+1;
    }
    printf("%lld",ans);
    return 0;
}

收益

不想打

排列交换

嘤 记得考试到最后啥都想不出来了就把暴力覆盖全部数据范围 万一还能过几个点呢QAQ 知道万一后面数据水的话能多水点分可是我就是没有加上去QAQ

void pup(int o){t[o]=Min(t[ls],t[rs]);}
int query(int o,int l,int r,int x,int y){
    //if(l>y||r<x) return inf;
    if(x<=l&&r<=y) return t[o];
    int mid=l+r>>1;
    if(y<=mid) return query(ls,l,mid,x,y);
    if(x>mid) return query(rs,mid+1,r,x,y);
    return min(query(ls,l,mid,x,y),query(rs,mid+1,r,x,y));
}
void upd(int o,int l,int r,int x,int k){
    if(l==r){t[o]=k;return;}
    int mid=l+r>>1;
    if(x<=mid) upd(ls,l,mid,x,k);
    else upd(rs,mid+1,r,x,k);
    pup(o);
}

priority_queue<int>q;vector<int>e[N];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    rd(n),rd(K);
    for(int i=1;i<=n;++i) rd(a[i]),b[a[i]]=i;
    memset(t,inf,sizeof(t));
    for(int i=n,x,k;i;--i){
        k=b[i],x=query(1,1,n,k-K+1,k);
        if(x<=n) e[b[x]].push_back(k),++in[k];
        x=query(1,1,n,k,k+K-1);
        if(x<=n) e[b[x]].push_back(k),++in[k];
        upd(1,1,n,k,i);
    }
    for(int i=1;i<=n;++i) if(!in[i]) q.push(i);
    for(int i=n,u;i;--i){
        a[i]=u=q.top(),q.pop();
        for(int i=0,v,sz=e[u].size();i<sz;++i) if(!--in[v=e[u][i]]) q.push(v);
    }
    for(int i=1;i<=n;i++) b[a[i]]=i;
    for(int i=1;i<=n;++i) printf("%d\n",b[i]);
    return 0;
}

85昏

    void work(){
        for(int i=1;i<=n;++i) b[a[i]]=i;a[0]=b[0]=0,a[n+1]=b[n+1]=n+1;
        bool use=1;
        while(use){
            use=0;
            for(int i=1,nw,pre,nxt;i<=n;++i){
                nw=a[i],pre=nw-1,nxt=nw+1;
                if(b[pre]-b[nw]>=K) a[b[pre]]=nw,a[b[nw]]=pre,swap(b[pre],b[nw]),use=1;
                if(b[nw]-b[nxt]>=K) a[b[nxt]]=nw,a[b[nw]]=nxt,swap(b[nxt],b[nw]),use=1;
            }
        }
        for(int i=1;i<=n;++i) printf("%d\n",a[i]);
        exit(0);
    }
int main(){
//  freopen("swap.in","r",stdin);
//  freopen("swap.out","w",stdout);
    rd(n),rd(K);
    for(int i=1;i<=n;++i) rd(a[i]);
    if(K==1){for(int i=1;i<=n;++i) printf("%d\n",i);return 0;}
    if(K==n-1){
        if(a[1]>a[n]) swap(a[1],a[n]);
        for(int i=1;i<=n;++i) printf("%d\n",a[i]);return 0;
    }
    work();
    return 0;
}
01-06 04:46