icpc2019 南京网络赛选拔赛 F 尺取 线段树维护区间最大值

 

 

 

#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define mp make_pair
#define pii pair<ll,ll>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(i,x,g,e) for(int i=g[x];i;i=e[i].next)
#define show(x) cout<<#x<<"="<<x<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<"="<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showmm(x,a,b) rep(i,0,a) rep(j,0,b) cout<<#x<<'['<<i<<']'<<'['<<j<<"]="<<x[i][j]<<(" \n"[j==b])
#define showm(x,a,b) rep(i,0,a) rep(j,0,b) cout<<x[i][j]<<(" \n"[j==b])
#define showa1(x,a,b) cout<<#x<<":\n";rep(i,a,b) showa(x,i);cout<<endl
#define showa2(x,a,b) cout<<#x<<": ";rep(i,a,b) cout<<x[i]<<' ';cout<<endl
using namespace std;//head
const int maxn=1e5+10,maxm=2e6+10;
const ll INF=0x3f3f3f3f,mod=1e9+7;
int casn,n,m,k;
int a[maxn];
class segtree{public:
#define nd  node[now]
#define ndl node[now<<1]
#define ndr node[now<<1|1]
  struct segnode {
    int l,r,mx;
    inline int mid(){return (r+l)>>1;}
    inline int len(){return r-l+1;}
  }node[maxn<<2|3];
  void maketree(int s,int t,int now=1){
    nd={s,t,0};
    if(s==t) return ;
    maketree(s,nd.mid(),now<<1);
    maketree(nd.mid()+1,t,now<<1|1);
  }
  void update(int pos,int x,int now=1){
    if(nd.l==nd.r){
       nd.mx=x;
       return ;
    }
    if(pos<=ndl.r)update(pos,x,now<<1);
    else update(pos,x,now<<1|1);
    nd.mx=max(ndl.mx,ndr.mx);
  }
  int query(int s,int t,int now=1){
    if(s<=nd.l&&t>=nd.r) return nd.mx;
    int a=0,b=0;
    if(s<=ndl.r) a=query(s,t,now<<1);
    if(t>ndl.r) b=query(s,t,now<<1|1);
    return max(a,b);
  }
}tree;
int vis[maxn],dp[maxn];
int main() {IO;
    cin>>casn;
    while(casn--){
      cin>>n>>k;
      tree.maketree(1,n);
      rep(i,1,n) cin>>a[i];
      rep(i,1,n) vis[a[i]]=i;
      rep(i,1,n){
          int l=max(1,vis[i]-k);
          int r=min(n,vis[i]+k);
          int x=tree.query(l,r);
          dp[i]=dp[x]+1;    
          tree.update(vis[i],i);
      }
      cout<<dp[1];
      rep(i,2,n){
        cout<<' '<<dp[i];
        vis[i]=dp[i]=0;
      }
      if(casn) cout<<'\n';
    }
    return 0;
}

 

posted @ 2019-09-03 15:28  nervending  阅读(219)  评论(0编辑  收藏  举报