题解- C F 1409 E \mathrm{CF1409E} CF1409E
题目意思
S o l \mathrm{Sol} Sol
真就我用数据结构做这道题目??!
我们首先对坐标离散化一下然后计算出以 i i i 开头的平台 [ i , i + k ] [i,i+k] [i,i+k] 能落下几个小球记做 s i s_i si 。我们对 s i s_i si 建一颗线段树维护区间最大值。
于是我们枚举第一个平台的起点 s t st st ,那么这次的贡献即为 s s t + max j = s t + 1 n ( s j ) s_{st}+\max\limits_{j=st+1}^{n}(s_j) sst+j=st+1maxn(sj),直接线段树算一下就好了。
时间复杂度 O ( n log n ) O(n \log n) O(nlogn)
C o d e \mathrm{Code} Code
int n,m,Q,x[N],y[N],a[N],gs[N],pre[N],s[N],mx[N<<2],ans;
inline void build(int x,int l,int r)
{
if(l==r)
{
mx[x]=s[l];
return;
}
int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
mx[x]=max(mx[x<<1],mx[x<<1|1]);
}
inline int ask(int x,int l,int r,int ll,int rr)
{
if(ll>r||rr<l) return 0;
if(ll<=l&&r<=rr) return mx[x];
int mid=l+r>>1,ans=0;
ans=max(ask(x<<1,l,mid,ll,rr),ask(x<<1|1,mid+1,r,ll,rr));
return ans;
}
int main()
{
io.read(Q);
for (;Q--;)
{
io.read(n),io.read(m);
For(i,0,n) gs[i]=0,pre[i]=s[i]=0;
For(i,1,n) io.read(x[i]),a[i]=x[i];
For(i,1,n) io.read(y[i]);
sort(a+1,a+n+1);
int tot=unique(a+1,a+n+1)-a-1;
For(i,1,n) gs[lower_bound(a+1,a+tot+1,x[i])-a]++;
For(i,1,n) pre[i]=pre[i-1]+gs[i];
For(i,1,n) s[i]=pre[upper_bound(a+i+1,a+tot+1,a[i]+m)-a-1]-pre[i-1];
build(1,1,tot);
For(i,1,tot) ans=max(ans,s[i]+ask(1,1,tot,upper_bound(a+i+1,a+tot+1,a[i]+m)-a,tot));
io.write(ans),puts(""),ans=0;
}
return 0;
}