zoukankan      html  css  js  c++  java
  • Array Beauty

    Array Beauty

    给出一个长度为n的序列({a_i}),定义一个序列的权值为其中元素两两之差的绝对值的最小值,询问({a_i})长度为K的子序列的权值之和(\% 998244353),(2leq kleq nleq 1000,max(a_i)leq 10^5)

    询问权值之和,除了枚举全部情况加起来,还有一种思路,对于每个权值看其出现的次数。

    于是可以枚举权值,找规律容易知道一种方案对应权值最大上限为(max(a_i)/(k-1)),枚举权值i,因为子序列具有明显的可递推性,考虑dp,但是不好处理权值正好为i,这种情况,显然考虑差分。

    因此设(f[j][k])表示长度为j,末尾以第k个元素结尾,然后权值大于等于i的方案数,然后发现子序列的选择与顺序无关,于是可以给({a_i})排序,然后我们有

    [f[j][k]=sum_{l=j-1,a_k-a_lgeq i}^{k-1}f[j-1][k] ]

    边界:(f[0][0]=1)

    最后对于每个i累加所有的(sum_{k=K}^nf[K][k])就是答案了。

    时间复杂度为(O(max(a_i)/(k-1) imes nk=nmax(a_i)))

    我觉得这到题目有几个地方,我没有反应过来,正好为某值不好求,应马上反应差分,数列集合问题第一反应是否能够排序。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define il inline
    #define ri register
    #define ll long long
    #define Size 1050
    #define xzz 998244353
    using namespace std;
    int a[Size],dp[Size][Size];
    il void read(int&);
    int main(){
    	int n,K,lim(0);read(n),read(K);
    	for(int i(1);i<=n;++i)
    		read(a[i]),lim=max(lim,a[i]);
    	sort(a+1,a+n+1),a[0]=-0x3f3f3f3f;
    	int i,j,k,l,r,ans(0);
    	for(i=1;i<=lim/(K-1);++i){
    		for(j=1,dp[0][0]=1;j<=K;++j)
    			for(k=j,l=j-1,r=0;k<=n;++k){
    				while(a[k]-a[l]>=i)
    					r=(r+dp[j-1][l])%xzz,++l;
    				dp[j][k]=r;
    			}
    		for(k=K;k<=n;++k)ans=(ans+dp[K][k])%xzz;
    	}printf("%d",ans);
    	return 0;
    }
    il void read(int &x){
    	x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');
    	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
    }
    
  • 相关阅读:
    夺命雷公狗TP3.2.3商城11-----后台头部和左侧导航分离
    夺命雷公狗TP3.2.3商城10-----中间层的创建,防止跨目录访问
    3.spring cloud eureka 高可用
    2.spring cloud eureka client配置
    1.spring cloud eureka server配置
    css去掉input记住密码的黄色
    34-THREE.JS 游泳圈
    32-THREE.JS 球体
    31-THREE.JS 正方体
    30-THREE.JS 圆环
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11426417.html
Copyright © 2011-2022 走看看