Codeforces 1188C DP 鸽巢原理
题意:定义一个序列的beauty值为序列中元素之差绝对值的最小值,现在给你一个数组,问所有长度为k的子序列的beauty值的和是多少?
思路:(官方题解)我们先解决这个问题的子问题:我们可以求出beauty值大于等于给你值的序列有多少个(假设为p[i]),那么其实答案就是∑(i从1到max(a)) p[i]。怎么求p数组呢?我们先对数组排序,假设现在求p[x], 设dp[i][j]为以第i个元素为结尾,长度为j的子序列的个数。那么所有a[i] - a[j] >= x的j都可以向i转移,所以,我们用指针维护满足a[i] - a[j] >= x的最靠近i的位置,并且维护前缀和以进行O(1)转移。这样每次的转移是O(n * k)的。假设m = max(a), 那么总的复杂度是O(m * n * k)。但是,我们发现,长度为k的序列有k - 1个差,那么beauty值的最小值为n / (k - 1) (由鸽巢原理可知), 所以复杂度变成了O(m / (k - 1) * n * k) = O(n * m)的,可以过。这个题需要注意一下,如果把dp的两维交换一下,即dp[i][j]表示长度为i的子序列中,以元素j为结尾的子序列的个数,这样表示可以快大概600ms。如果学过《深入理解计算机系统》可能会知道为什么,因为n >= k, 所以访问n的机会多,放第二维会让n的访问之间连续,时间更短。这题可能有点卡long long。
代码:
#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define pii pair<int, int>
#define db double
using namespace std;
const LL mod = 998244353;
const int maxn = 1010;
int dp[maxn][maxn];
int sum[maxn][maxn];
int a[maxn];
int ans = 0;
int n, k;
void solve(int x) {
for (int i = 0; i <= k; i++)
for (int j = 1; j <= n; j++) {
dp[i][j] = 0;
sum[i][j] = 0;
}
for (int i = 1; i <= n; i++) dp[1][i] = 1;
for (int i = 1; i <= k; i++) {
int l = 1;
for (int j = 1; j <= n; j++) {
while(a[j] - a[l] >= x) l++;
dp[i][j] = (dp[i][j] + sum[i - 1][l - 1]) % mod;
sum[i][j] = (dp[i][j] + sum[i][j - 1]) % mod;
}
}
for (int i = 1; i <= n; i++)
ans = (ans + dp[k][i]) % mod;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= a[n] / (k - 1); i++) {
solve(i);
}
printf("%d\n", ans);
}
Codeforces 1188C DP 鸽巢原理的更多相关文章
- cf319.B. Modulo Sum(dp && 鸽巢原理 && 同余模)
B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- CodeForces 125D【鸽巢原理】
哇塞?开始的三个数其中两个数一定能确定一个序列.(鸽巢原理) #include <bits/stdc++.h> using namespace std; typedef long long ...
- Codeforces 1178E Archaeology (鸽巢原理)
题意: 给你1e6的字符串,保证只含'a''b''c'三种字符,且相邻两个字符一定不一样 求一个大于等于n/2的回文子序列 思路: 朴素的最长回文子序列是n方的区间dp,这题显然不行,要充分利用题中所 ...
- Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value(鸽巢原理)
题目链接:https://codeforces.com/problemset/problem/1365/E 题意 有 $n$ 个元素,定义大小为 $k$ 的集合值为 $\sum2^i$,其中,若集合内 ...
- Codeforces.618F.Double Knapsack(构造 鸽巢原理)
题目链接 \(Description\) 给定两个大小为\(n\)的可重集合\(A,B\),集合中的元素都在\([1,n]\)内.你需要从这两个集合中各选一个非空子集,使它们的和相等.输出方案. \( ...
- ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)
这章没有什么算法可言,单纯的你懂了原理后会不会运用(反正我基本没怎么用过 ̄ 3 ̄) 有366人,那么至少有两人同一天出生(好孩子就不要在意闰年啦( ̄▽ ̄")) 有13人,那么至少有两人同一月 ...
- Find the duplicate Number (鸽巢原理) leetcode java
问题描述: Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive ...
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) F. Double Knapsack 鸽巢原理 构造
F. Double Knapsack 题目连接: http://www.codeforces.com/contest/618/problem/F Description You are given t ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
随机推荐
- openstack--all-in-one部署
安装过程 本次宿主机(即安装OpenStack的机器)的操作系统是CentOS 7.5.安装的OpenStack是目前最新的rocky版本,官方文档建议机器至少有16 GB的内存,处理器硬件虚拟化扩展 ...
- Linux ct6.5安装rabbitmq
yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto 1.Erlang安装配置 下载安装包,地址http://www.e ...
- BZOJ5261 Rhyme
传送门 广义后缀自动机= =+ 跟ptx大爷的博客学的 戳我传送 我写的第一种 建立Trie树的写法 bfs建立SAM 为什么是bfs呢 我也不知道(GG) 经过我一番抱大腿+询问 各位大爷说的原因是 ...
- STM32 NVIC中断优先级分组说明
STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个) 中断管理方法 首先,对STM32中断进行分组,组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值. 分组配置是 ...
- 【UNR #2】黎明前的巧克力 解题报告
[UNR #2]黎明前的巧克力 首先可以发现,等价于求 xor 和为 \(0\) 的集合个数,每个集合的划分方案数为 \(2^{|S|}\) ,其中 \(|S|\) 为集合的大小 然后可以得到一个朴素 ...
- 转载:eclipse中web项目小地球没了
转载自:{FROM:http://www.cnblogs.com/zhouyalei/archive/2013/01/30/2882651.html} MyEclipse下创建的项目 导入eclips ...
- html中ul,ol和li的区别
ul是无序列表,全称是unordered list,先来个例子: ●张三 ●李四 ●王二 ●刘五 ol是有序列表 ,全称是ordered list,同样举个例子: 1.张 ...
- Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class
Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class A well-architecte ...
- IntelliJ IDEA更新maven依赖包
问题: IntelliJ IDEA自动载入Maven依赖的功能很好用,但有时候会碰到问题,导致pom文件修改却没有触发自动重新载入的动作,此时需要手动强制更新依赖. 方法: 方法一: ①.右键单击项目 ...
- git开发实战:认识git
git简介: git是分布式版本控制系统,相比较svn相比,git会在本地保存完整的提交记录,即使远程服务器宕机数据消失,可以将本地分支提交到远程服务器,本地分支会保存完整的记录.只要文件提交到git ...