1 条题解

  • 0
    @ 2026-2-4 23:42:29

    题意

        ~~~~ 给出 nn 个数表示砖长,通过排列使其构成一个数列,满足 ai+Dai+1a_i+D\geq a_{i+1},求可以构成的数列个数(每个数字互不相同)

    题解

        ~~~~ 显然某一块砖能放在哪些砖上面是固定的,并且在升序的序列中,对于砖块 ii ,它可以放的砖块区间是一个右端 r=nr=n,左端点 lil\leq i 的区间。

        ~~~~ 因此先升序排序,从左至右对每一块砖维护其能放在哪些前面的砖上面。

        ~~~~ 注意到必须满足 ai+daj(i<j)a_i+d\geq a_j(i<j),因此在升序的 aa 序列里随着 jj 的增加,最小的满足条件的 ii 也会增加。

        ~~~~ 因此对于每个砖块 ii 双指针维护合法区间 [l,r][l,r](这里的 r=ir=i ),注意到放在地上/更大的砖上也是一种选择(但是放在哪块最大的砖上是由大砖来计算的),因此每块砖的合法数量为 rl+1r-l+1,累乘即可。

    代码

    #include <cstdio>
    #include <algorithm>
    #define ll long long
    using namespace std;
    int arr[620005];
    const int MOD=1e9+9;
    int main() {
    	int n,k;ll Ans=1;
    	scanf("%d %d",&n,&k);
    	for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
    	sort(arr+1,arr+1+n);
    	for(int l=1,r=1;r<=n;r++)
    	{
    		while(arr[l]+k<arr[r]) l++;
    		Ans=Ans*(r-l+1)%MOD;
    	}
    	printf("%lld",Ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    3678
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者