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[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的更多相关文章
- CF1188C Array Beauty(DP)
日常降智. 不过还是第一次和 2700 的题正解这么近呢-- 由于排序后不影响答案,而且直觉告诉我们排序后会更好做,不妨排个序. 直觉告诉我们,变成求最小差 \(\ge v\) 的方案数会比最小差 \ ...
- Array Beauty CodeForces - 1189F (dp,好题)
大意: 定义$n$元素序列$a$的美丽度为 $\min\limits_{1\le i<j\le n}|a_i-a_j|$. 给定序列$a$, 求$a$的所有长为$k$的子序列的美丽度之和. 记 ...
- Codeforces 1189F. Array Beauty
传送门 首先可以注意到序列里面元素的顺序对答案是没有影响的,所以二话不说先排序再看看怎么搞 考虑枚举每种子序列可能产生的贡献并算一下产生这个贡献的子序列有多少 考虑设 $F(x)$ 表示选择的元素差值 ...
- 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 ...
- 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 ...
- codeforces D
D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...
- Mishka and Interesting sum
Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes input ...
- 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 ...
- codeforces 703D Mishka and Interesting sum 偶数亦或 离线+前缀树状数组
题目传送门 题目大意:给出n个数字,m次区间询问,每一次区间询问都是询问 l 到 r 之间出现次数为偶数的数 的亦或和. 思路:偶数个相同数字亦或得到0,奇数个亦或得到本身,那么如果把一段区间暴力亦或 ...
随机推荐
- get和post 两种基本请求方式的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- 【leetcode】990. Satisfiability of Equality Equations
题目如下: Given an array equations of strings that represent relationships between variables, each strin ...
- MariaDB Where子句
WHERE 子句过滤各种语句,如SELECT,UPDATE,DELETE和INSERT. 他们提出了用于指定行动的标准. 它们通常出现在语句中的表名后面,其条件如下. WHERE子句本质上像一个if语 ...
- hdu 6103 Kirinriki (枚举对称中心+双指针)
Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑(i=0 ...
- 说下vue工程中代理配置proxy
这个代理配置不需要后台进行ngnix代理跳转了,前端可以做.在vue.config.js文件中进行配置,如下: module.exports = { publicPath: process.env.V ...
- Nginx加载多个CPU核心,worker_cpu_affinity
配置Nginx多核CPU,worker_cpu_affinity使用方法和范例1. 2核CPU,开启2个进程 worker_processes 2;worker_cpu_affinity 01 10; ...
- 小程序 ios 10.1.x 白屏问题
遇到这个问题有点莫名其妙只有IOS10.1.x显示白屏 解决过程很坎坷,一开始以为是调试基础库的问题,改成最新的2.9.2版本. 用这个创建新的项目,把之前的项目内容放到新建项目内, 发现还是不行,后 ...
- CCflow与基础框架组织机构整合
SELECT No,Name,Pass,FK_Dept,SID FROM Port_Emp SELECT No,Name,ParentNo FROM Port_Dept SELECT No,Name, ...
- JavaScript实现10大算法可视化
参考博客: https://www.cnblogs.com/Unknw/p/6346681.html#4195503 十大经典算法 一张图概括: 名词解释: n:数据规模 k:“桶”的个数 In-pl ...
- charles使用教程
概述 Charles是目前最强大的http调试工具,在界面和功能上远胜于Fiddler,同时是全平台支持.是收费软件,可以试用15分钟,下面提供了破解方法. 安装破解 https://www.cn ...