Codeforces 1189F. Array Beauty
首先可以注意到序列里面元素的顺序对答案是没有影响的,所以二话不说先排序再看看怎么搞
考虑枚举每种子序列可能产生的贡献并算一下产生这个贡献的子序列有多少
考虑设 $F(x)$ 表示选择的元素差值至少为 $x$ 的长度为 $k$ 的子序列的方案数
那么最终如果直接把每个 $F(x),x \in [1,max(a)]$ 加起来会发现,对于任意一种差值为 $t$ 的方案,它都被所有 $x<=t$ 的 $F(x)$ 各计算到了一次,那么总贡献即为 $t$,所以只要求出 $F$ 然后加起来就是我们要的答案
先不考虑复杂度,那么这个显然是可以 $dp$ 的,设 $f[i][j]$ 表示长度为 $i$ ,考虑了前 $j$ 个位置,第 $j$ 个位置强制选择时的子序列方案数
那么有转移 $f[i][j]+=f[i-1][k]$ 其中 $k<j$ 并且 $a_j-a_k>=x$ (注意这时 $a$ 已经按从小到大排序了)
注意到随着 $j$ 的增加,合法的 $k$ 一定是越来越大的并且是一段前缀区间,那么转移显然可以维护一个指针和一个前缀和加速到 $O(1)$
现在单次 $dp$ 的复杂度就是优秀的 $nk$ 了,那么再考虑一下枚举 $x$ 的复杂度,很好,复杂度达到了优秀的 $max(a)nk$
然后注意到一个看似微不足道的优化:枚举 $x$ 的时候如果 $x>max(a)/k+1$ ,那么一定不存在合法的长度为 $k$ 的序列了(显然吧)
发现复杂度就变成了 $\frac {max(a)} {k+1}nk$ 即 $max(a)n$ ...
然后就过了......
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=,mo=;
inline int fk(int x) { return x>=mo ? x-mo : x; }
int n,m,A[N];
int f[N][N],ans;
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++) A[i]=read();
sort(A+,A+n+); int mx=A[n];
for(int I=;I<=mx/(m-);I++)
{
for(int i=;i<=n;i++) f[][i]=;
for(int i=;i<=m;i++)
{
int sum=,p=;
for(int j=;j<=n;j++)
{
while(A[p]+I<=A[j])
sum=fk(sum+f[i-][p++]);
f[i][j]=sum;
}
}
for(int i=;i<=n;i++) ans=fk(ans+f[m][i]);
}
printf("%d\n",ans);
return ;
}
Codeforces 1189F. Array Beauty的更多相关文章
- Array Beauty
Array Beauty 给出一个长度为n的序列\(\{a_i\}\),定义一个序列的权值为其中元素两两之差的绝对值的最小值,询问\(\{a_i\}\)长度为K的子序列的权值之和\(\% 998244 ...
- Array Beauty CodeForces - 1189F (dp,好题)
大意: 定义$n$元素序列$a$的美丽度为 $\min\limits_{1\le i<j\le n}|a_i-a_j|$. 给定序列$a$, 求$a$的所有长为$k$的子序列的美丽度之和. 记 ...
- Codeforces 797E - Array Queries
E. Array Queries 题目链接:http://codeforces.com/problemset/problem/797/E time limit per test 2 seconds m ...
- Codeforces 1108E2 Array and Segments (Hard version) 差分, 暴力
Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between eas ...
- CodeForces 300A Array
http://codeforces.com/problemset/problem/300/A 题意 :给你n个数字,让你分成3组,第一组各个数之积要小于0,第二组要大于0,第三组要等于0,符合要求的答 ...
- 网络流(最大流):CodeForces 499E Array and Operations
You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...
- Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)
题目链接:Array and Segments (Hard version) 题意:给定一个长度为n的序列,m个区间,从m个区间内选择一些区间内的数都减一,使得整个序列的最大值减最小值最大. 题解:利 ...
- Codeforces 623B Array GCD
Array GCD 最后的序列里肯定有a[1], a[1]-1, a[1]+1, a[n], a[n]-1, a[n]+1中的一个,枚举质因子, dp去check #include<bits/s ...
- CodeForces 57C Array 组合计数+逆元
题目链接: http://codeforces.com/problemset/problem/57/C 题意: 给你一个数n,表示有n个数的序列,每个数范围为[1,n],叫你求所有非降和非升序列的个数 ...
随机推荐
- Hadoop环境搭建|第三篇:spark环境搭建
一.环境搭建 1.1.上传spark安装包 创建文件夹用于存放spark安装文件命令:mkdir spark 1.2.解压spark安装包 命令:tar -zxvf spark-2.1.0-bin-h ...
- mysql测试记录
一直觉得mysql的Memony内存引擎挺好,其他数据库都没有,正好有空,所以试试. 版本:mysql-installer-community-8.0.17.0 os:windows10 SSD硬盘, ...
- 如何修改layer-layui中的confirm
需求: 改成 背景: 这个confirm是layui中的layer弹出框,要想修改这个弹出框的内容岂不是要去修改源码?当我在源码里扒拉半天梳理好了逻辑之后,突然意识到,其实我本可以不必这么麻烦的,直接 ...
- python从入门到放弃之anconada真愁人
原先未使用anconada,用的python2.7,每次install各种包各种问题真的心累 后来装了anconada,安装了python3.6 使用起来比较方便了. 陆续将遇到的问题更新如下~ 一 ...
- spring 事务-使用@Transactional 注解(事务隔离级别)
转: spring 事务-使用@Transactional 注解(事务隔离级别) 2016年08月11日 21:49:20 华华鱼 阅读数 15490 标签: spring事务Transactiona ...
- 21 Flutter仿京东商城项目 商品详情 请求接口渲染数据 商品属性数据渲染
加群452892873 下载对应21可文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^0.1.2 flutter ...
- spring boot入门学习---1
1.maven配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- java8:(Lambda 表达式简介)
JDK8的新特性——Lambda表达式 JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分 ...
- (IStool)软件打包时当文件存在时不覆盖文件(配置文件)
需求:程序实际使用过程中有些配置信息是需要用户手动配置的,不同客户使用配置信息也不同,所以软件发布前需要考虑这个问题,覆盖安装时需要忽略这些配置文件 实现:当对应的目录下由此文件的时候不覆盖此文件 [ ...
- Reactor系列(四)subscribe订阅
#java# #reactor# #subcribe# #订阅# 视频讲解 :https://www.bilibili.com/video/av79117693/ FluxMonoTestCase.j ...