Array Beauty

给出一个长度为n的序列\(\{a_i\}\),定义一个序列的权值为其中元素两两之差的绝对值的最小值,询问\(\{a_i\}\)长度为K的子序列的权值之和\(\% 998244353\),\(2\leq k\leq n\leq 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_l\geq i}^{k-1}f[j-1][k]
\]

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

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

时间复杂度为\(O(\max(a_i)/(k-1)\times 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();
}

Array Beauty的更多相关文章

  1. CF1188C Array Beauty(DP)

    日常降智. 不过还是第一次和 2700 的题正解这么近呢-- 由于排序后不影响答案,而且直觉告诉我们排序后会更好做,不妨排个序. 直觉告诉我们,变成求最小差 \(\ge v\) 的方案数会比最小差 \ ...

  2. Array Beauty CodeForces - 1189F (dp,好题)

    大意: 定义$n$元素序列$a$的美丽度为 $\min\limits_{1\le i<j\le n}|a_i-a_j|$. 给定序列$a$, 求$a$的所有长为$k$的子序列的美丽度之和. 记 ...

  3. Codeforces 1189F. Array Beauty

    传送门 首先可以注意到序列里面元素的顺序对答案是没有影响的,所以二话不说先排序再看看怎么搞 考虑枚举每种子序列可能产生的贡献并算一下产生这个贡献的子序列有多少 考虑设 $F(x)$ 表示选择的元素差值 ...

  4. Codeforces Round #365 (Div. 2) D 树状数组+离线处理

    D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...

  5. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线+线段树

    题目链接: http://codeforces.com/contest/703/problem/D D. Mishka and Interesting sum time limit per test ...

  6. codeforces D

    D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...

  7. Mishka and Interesting sum

    Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes input ...

  8. Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum 树状数组+离线

    D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...

  9. codeforces 703D Mishka and Interesting sum 偶数亦或 离线+前缀树状数组

    题目传送门 题目大意:给出n个数字,m次区间询问,每一次区间询问都是询问 l 到 r 之间出现次数为偶数的数 的亦或和. 思路:偶数个相同数字亦或得到0,奇数个亦或得到本身,那么如果把一段区间暴力亦或 ...

随机推荐

  1. Paint的Gradient的用法(转)

    转自:https://www.jianshu.com/p/02b02c1696b2 Paint的Gradient的用法 嗯哼嗯哼嗯哼嗯哼 关注 2017.07.04 15:45* 字数 173 阅读 ...

  2. jQuery遍历之同级遍历

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  3. Inno Setup Conpiler 使用方法

    Inno Setup Conpiler 使用方法: 首先创建一个空白的脚本文件,点击NEXT 然后会进入到这个界面,提示你详细说明一下软件的基本信息 Application name: 应用程序名称 ...

  4. 让vue用于小程序setData方法

    setData:function(obj){ let that = this; let keys = []; let val,data; Object.keys(obj).forEach(functi ...

  5. LG1010 幂次方

    题目描述 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) ...

  6. 一些idea

    二分答案似乎和最小生成树有着不可描述的奇怪关系.(滑稽 联赛级别的在矩形上乱搞的题无非几个思路(按出现概率排序):建图,二维前缀和,dp 涉及到求合法区间数的问题往往要用到桶.等差数列等思想,或者尝试 ...

  7. CentOS 6.9 安装配置zeromq、jzmq

    官方安装配置链接 安装zeromq 步骤一.准备C语言环境 yum -y install gcc-c++ 步骤二.解压缩zeromq tar -zxf zeromq-4.1.6.tar.gz 步骤三. ...

  8. CentOS 7 & php7.2安装 php-redis 扩展

    CentOS 7 & php7.2安装 php-redis 扩展 1.下载phpredis-developcd /tmpwget https://codeload.github.com/php ...

  9. mybatis原理与设计模式-日志模块- 适配器模式

    在讲设计模式之前,得先知道java程序设计中得六大原则,才能更好得理解我们得系统为什么需要设计模式 1 单一职责原则 一个类只负责一种职责,只有这种职责的改变会导致这个类的变更.绕口一点的正统说法:不 ...

  10. 在使用 Eclisp 生成 实体(sql Server) 出现错误 :Unable to locate JAR/zip in file system as specified by the driver definition: sqljdbc.jar.

    错误: 解决方法: 第一步:点击 JAR List 第二步:  点击  Remove  JAR/ZIP 第三步: 再添加一下 sqljdbc.jar