C3 - Encryption (hard)

思路:

记sum[i]表示0 - i 的和对 p 取模的值。

1.如果k * p > n,那么与C2的做法一致,O(k*p*n)复杂度低于1e8。

2.如果k * p <= n

那么根据抽屉原理,必有k个sum[i]相同,

那么任意取k - 1个相同的 sum[i],记它们的下标为 l1,l2,......,lk-1 ,那么显然区间[li + 1, li+1](1<=i<k-1)的贡献为0

有贡献的区间只有[1,l1]和[lk-1 + 1,n]由于两个区间的贡献加起来小于2 * (p - 1) ,所以最后的答案要么为 sum[n],要么为 sum[n] + p

那么怎么判断是前者还是后者呢?

只要判断在sum中能不能找到一个以sum[n]结尾的长度为k的非严格上升子序列就可以了

如果能找到就是sum[n],否则就是 sum[n] + p

LIS的复杂度O(nlogn)

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define mem(a, b) memset(a, b, sizeof(a)) const int N = 5e5 + ;
const int INF = 0x3f3f3f3f;
int a[N];
int dp[][];
int _dp[N];
int main() {
int n, k, p;
scanf("%d%d%d", &n, &k, &p);
for (int i = ; i <= n; i++) scanf("%d", &a[i]),a[i] += a[i-], a[i] %= p;
if (k * p > n) {
mem(dp, INF);
dp[][] = ;
for (int i = ; i <= n; i++) {
for (int j = k; j >= ; j--) {
for (int l = ; l < p; l++){
dp[a[i]][j] = min(dp[a[i]][j], dp[l][j-] + ((a[i] - l)%p+p)%p);
}
}
}
printf("%d\n", dp[a[n]][k]);
}
else {
mem(_dp, INF);
for (int i = ; i <= n - ; i++) {
*upper_bound(_dp + , _dp + n, a[i]) = a[i];
}
if(_dp[k - ] <= a[n]) printf("%d\n", a[n]);
else printf("%d\n", a[n] + p);
}
return ;
}

最新文章

  1. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
  2. IOS开发之控件篇UICollectionViewControllor第一章 - 普通介绍
  3. centos7 Linux 安装mysql
  4. 当您尝试从 64 位 SQL Server 客户端上运行分布式的查询到链接的 32 位 SQL Server 时,您可能会收到一条错误消息
  5. 运维技能大全 | Devops Tools 周期表
  6. jQuery 杂项方法
  7. java事件处理
  8. Eclipse格式化代码换行、删除空行
  9. javascript 的继承
  10. It appears that the Web Project,“”,has no Web Root directory setup
  11. 【字】biang
  12. 改变highCharts的X轴和Y轴的数据刻度
  13. java中的多态是怎么体现的
  14. CentOS7搭建配置SVN服务器
  15. hihoCoder #1106 : Koch Snowflake 微软苏州校招笔试(1月17日)
  16. Scrapy对接selenium+phantomjs
  17. easyui form validate总是返回false原因
  18. Expert C Programming 阅读笔记(CH2)
  19. javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)
  20. POJ - 3648 Wedding (2-SAT 输出解决方案)

热门文章

  1. django图书管理系统实例
  2. python的zipfile、tarfile模块
  3. 常用MarkDown标记
  4. tcp编程 示例
  5. android 导出apk
  6. Unity3D之主菜单
  7. 16 级高代 II 思考题九的七种解法
  8. topcoder srm 695 div1 -3
  9. 237. 程序自动分析 【map+并查集】
  10. win10中命令操作Zookeeper