题解 CF1409E 【Two Platforms】

题解- 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;
}
		

猜你喜欢

转载自blog.csdn.net/wangyiyang2/article/details/108425300