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],叫你求所有非降和非升序列的个数 ...
随机推荐
- 文本处理三剑客之awk
简介 awk是一种处理文本文件的语言,是一个强大的文本编辑工具.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理. gawk 用法:gawk [optio ...
- arcgis python 获得表字段的唯一值
#获得唯一值 by gisoracle def getuniqueValue(inTable,inField): rows = arcpy.da.SearchCursor(inTable,[inFie ...
- How to Publish a NuGet Package
How to Publish a NuGet Package Command line To push packages to nuget.org you must use nuget.exe v4. ...
- oracle-游标-存储过程-函数-包
一.存储过程 不可以在insert,update,delete中直接使用,可以有return但代表的是退出过程 过程有三种类型:不返回值,可以返回多个值,参数有三种类型,分别如下: in:只输入,不返 ...
- DSS分发压力实验
DSS分发压力实验 昨天为验证依托DSS搭建流媒体直播监控系统的可行性,及确定实时流画面出现严重花屏的原因,做了一个压力实验. 网络拓扑如图: 1.DVR上配置4路视频(CIF / 25fps / 1 ...
- Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...
- PAT 甲级 1017 Queueing at Bank (25 分)(模拟题,有点思维小技巧,第二次做才理清思路)
1017 Queueing at Bank (25 分) Suppose a bank has K windows open for service. There is a yellow line ...
- Node.js起一个web服务器
开启服务: 代码如下: var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP ...
- 【leetcode】509. Fibonacci Number
problem 509. Fibonacci Number solution1: 递归调用 class Solution { public: int fib(int N) { ) return N; ...
- CentOS 7下Cloudera Manager及CDH 6.0.1安装过程详解
目录 一.概念介绍 1.CDH 概览 2.Cloudera Manager 概览 二.环境准备 1.软件版本选择 2.节点准备(四个节点) 3.配置主机名和hosts解析(所有节点) 4.关闭防火墙 ...