第一周测试赛 & 第二周测试赛
监控
1、算法思想维度
问题类型:贪心、并查集
误判原因:并查集处理区间覆盖时直接从 \(r\) 开始,应该从 Find(r),因为 \(r\) 可能已经被覆盖。
正确思路:考虑按右端点排序,我们肯定监视最右边的 \(k\) 个点,因为这样可以与后面区间重合的更多,考虑用树状数组维护区间和,并查集维护前一个没有被监视的点,即可。
2、实现细节维度
边界条件:排序时右端点相同按左端点从小到大排序。
数据结构:使用链表会更快。
3、数学建模维度
复杂度计算:
因为每个点只会被选择一次
- 树状数组:\(O(q \log n)\)
- 并查集:\(O((q + n) \log n)\)
- 总复杂度:\(O((q + n)\log n)\)
4、改进措施
- 注意细节,写完代码后尽量默读一遍,找出潜在错误。
- 不要只会使用高级算法,要一题多解,练好基本功。
age
1、算法思想维度
问题类型判定:分讨、二分
误判原因:没有时间做……
正确思路:当 \(b > 10^6\) 时,\(x\) 至多 \(3\) 位,枚举 \(x\),二分 \(b\),判断 \(y\) 是否满足条件,当 \(b \le 10^6\),枚举 \(b\) 判断即可。
2、实现细节维度
边界条件:当 \(x > 100\) 时,将二分边界缩小,否则会爆 long long。
框架提炼
int W(int x, int k) {
int val = 0, bs = 1;
for (; x; x /= k, bs *= 10) {
if (x % k >= 10) {
return -1;
}
val += bs * (x % k);
}
return val;
}
int C(int x, int k) {
return x % 10 + (x / 10 % 10) * k + (x / 100) * k * k;
}
signed main() {
ans = 10;
cin >> n >> m;
for (int i = m; i <= 999; i++) {
int l = 1, r = 1e18;
for (; l < r;) {
int mid = (l + r) / 2;
C(i, mid) >= n ? r = mid : l = mid + 1;
}
if (C(i, r) == n) {
ans = max(ans, r);
}
}
for (int i = 1e6; i >= ans; i--) {
if (W(n, i) >= m) {
ans = i;
break;
}
}
cout << ans;
}
亲密度
1、算法思想维度
问题类型判定:二分。
误判原因:一眼不会就放弃了,应该在仔细思考的。
正确思路:考虑枚举判断第 \(k\) 对的亲密度是否是 \(x\),考虑求出所有亲密度为 \(x\) 的二元组,在用双指针减去颜色相同的,很显然这个过程可以用二分优化。
2、实现细节维度
边界条件:注意要开 long long,如果所有合法二元组都没有 \(k\) 个就输出 -1。
框架提炼
int Calc(int x) {
int p = (n - x) * x + x * (x - 1) / 2;
for (int i = 1; i <= n; i++) {
int l = 0;
for (int j = 0; j < v[i].size(); j++) {
for (; l < v[i].size() && v[i][j] - v[i][l] > x; l++);
p -= (j - l);
}
}
return p;
}
signed main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
v[a[i]].push_back(i);
}
if (Calc(n) < k) {
return cout << -1, 0;
}
int l = -1, r = n + 1;
for (; l + 1 < r;) {
int mid = (l + r) / 2;
Calc(mid) < k ? l = mid : r = mid;
}
int cnt = Calc(l), d = l + 1;
for (int i = 1; i <= n - d; i++) {
if (a[i] != a[i + d]) {
cnt++;
}
if (cnt == k) {
return cout << i << ' ' << i + d, 0;
}
}
}
3、数学建模维度
- 二分:\(O(\log n)\),Check:\(O(n)\)
- 总共 \(O(n\log n)\)。
4、改进措施
- 分配好时间,注意策略,昨晚前两题后在后两题里选最擅长的做。
抢红包
1、算法思想维度
问题类型判定:堆、DP
误判原因:过于浮躁,导致算法选择出现问题一个很简单的问题查了很久。
正确思路:DP,然后用按左端点排序,用堆懒删除维护。
2、实现细节维度
边界条件:\(f_{1,0}=f_{1,1}=0\),其余为 \(10^9\)。
数据结构:开始使用没有懒标记的线段树,应该使用堆或懒标记。
框架提炼
sort(a + 1, a + k + 1, [](Node x, Node y) { return x.s < y.s; });
fill(f[1], f[n + 2], 1e18), f[1][0] = f[1][1] = 0;
for (int i = 1, j = 1; i <= n; i++) {
for (; j <= k && a[j].s == i; j++) {
q.push(a[j]);
}
for (; q.size() && q.top().t < i; q.pop());
if (q.empty()) {
for (int j = 0; j <= m; j++) {
f[i + 1][j] = min(f[i + 1][j], f[i][j]);
}
} else {
for (int j = 0; j <= m; j++) {
f[q.top().d + 1][j] = min(f[q.top().d + 1][j], f[i][j] + q.top().w);
}
for (int j = 0; j < m; j++) {
f[i + 1][j + 1] = min(f[i + 1][j + 1], f[i][j]);
}
}
}
3、数学建模维度
状态定义:\(f_{i,j}\) 表示前 \(i\) 个数跳过 \(j\) 次的最小值。
转移方程:若能领红包则 \(f[q.top().d + 1][j] = min(f[q.top().d + 1][j], f[i][j] + q.top().w),f[i + 1][j + 1] = min(f[i + 1][j + 1], f[i][j]);\),否则 \(f[i + 1][j] = min(f[i + 1][j], f[i][j])\)。
复杂度计算:
状态数量:\(nm\)。
转移复杂度:\(O(1)\) 或 \(O(\log n)\)
总复杂度 \(nm\)。
4、改进措施
- 考试时不能浮躁,要把代码想清楚了再写。
第一周测试赛 & 第二周测试赛的更多相关文章
- 中国(北方)大学生程序设计训练赛(第二周) (A B D G)
比赛链接 A题是KMP,先把A拼接到B的后面,然后利用next数组的意义(包括其具体含义,以及失配时的应用),得到ans #include<bits/stdc++.h> using nam ...
- Xeon 第一次训练赛 苏州大学ICPC集训队新生赛第二场(同步赛) [Cloned]
A.给出一个字符串,求出连续的权值递增和,断开以后权值重新计数,水题 #include<iostream> #include<string> #include<cmath ...
- 20145330孙文馨 《Java程序设计》第二周学习总结
20145330孙文馨第二周学习总结 第二周相比于第一周对java语言有了深一点的了解,也意识到多敲代码才是学习计算机语言的最好方法. 教材内容总结 类型.变量与运算符 *基本类型 整数(short. ...
- 20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现
20155306 2017-2018-1<信息安全系统设计>第二周课堂测试以及myod的实现 第二周课堂测验: (注:前两项在课堂已提交,在此不做详解) 第一项: 每个.c一个文件,每个. ...
- 2019-2020-1 20199329 第二周测试(环境:ubuntu64位)
2019-2020-1 20199329 第二周测试(环境:ubuntu64位) 实验一 0.每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号 1.用Vi输入图中代码,并用gcc编译通过 ...
- 2018.10.2浪在ACM 集训队第二次测试赛
2018.10.26 浪在ACM 集训队第二次测试赛 题目一览表 来源 考察知识点 A 1273 海港 NOIP 普及组 2016 差分数组+二分 B 1274 魔法阵 C 1267 金币 ...
- 20145209刘一阳《JAVA程序设计》第二周课堂测试
第二周课堂测试 1.if关键字后面的小括号内,表达式的值可以为10.(B) A .true B .false 2.表达式0xaa | 0x55的值为(C) A .FF B .0 C .255 D .1 ...
- 20155207第二周myod以及课堂测试
第二周myod以及课堂测试 第二周测试5 题目 1.除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main ...
- 20155322 2017-2018-1《信息安全系统设计》第二周 课堂测试 Linux下C语言实现MYOD
20155322 2017-2018-1<信息安全系统设计>第二周 课堂测试 Linux下C语言实现MYOD [博客目录] 静态库测试 实现方法 相关资料 操作 动态库测试 实现方法 相关 ...
- 2018.10.26 浪在ACM 集训队第二次测试赛
2018.10.26 浪在ACM 集训队第二次测试赛 整理人:苗学林 A海港 参考博客:[1]:李继朋https://www.cnblogs.com/violet-acmer/p/9859006.ht ...
随机推荐
- 一个static关键字引发的线上故障:深度剖析静态变量与配置热更新的陷阱
引言:一个看似无害的修改 "这不可能有问题!" 我盯着屏幕上的代码变更,反复确认那个仅仅增加了static关键字的修改. 事情的起因是我们需要上线一个新的HTTP接口调用功能,为了 ...
- jq通过自定义属性获取标签对象
https://blog.csdn.net/qq_44927883/article/details/106360358$("td[data-field='fieldHtmlType']&qu ...
- 4G DTU在废品智能回收系统中的应用
1.概述 废品智能回收系统要实现的功能描述: 可回收物:可投放到智能垃圾分类回收箱的大致有这五大品类:纸类.纺织物.金属.塑料.玻璃.回收柜上各品类是分开箱体的,需要把对应的可回收物投放到对应的箱体内 ...
- prettier继承
不支持extends prettier配置并不支持 extends 关键字,但是我们可以手动合并,比方说我们下载了一个配置包 @repo/config-prettier,我们可以如下继承到自己项目中 ...
- 前端开发系列132-进阶篇之脚手架Yue-cli的实现01-commander模块
这是系列文章`前端脚手架实现`的第一篇,主要讲解脚手架工具中的核心模块命令行参数解析功能的实现,重点讲解 Node 模块 [commander]()的使用. 在前端开发中我们已经接触过各种各样的脚手架 ...
- 日事清|管理驾驶舱,公司高管、PM必备观察工具
场景介绍 01:一键切换「驾驶舱」高管视图 ● 驾驶舱适配办公室大屏.项目例会投屏展示.管理层统一回顾等场景: ● 每分钟自动更新数据,确保您看到的永远是最新的进度与状态: ● 今日在线人数.本周完成 ...
- Practice Infinity: Set Theory: Cardinality + Infinity comparation
Practice Infinity Course description Reckoning with infinity is one of the major accomplishments of ...
- Sql Server存储过程中游标的使用
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...
- Go 原理之 GMP 并发调度模型
一.Go 的协程 goroutine go 的特性:协程(goroutine),goroutine 是 go 自己实现的.为了解决线程的性能问题,goroutine 协程是用户态的,由 go runt ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)
1.简介 跟随宏哥学习的小伙伴或者童鞋们想必已经在宏哥Python+Playwright系列文章中知道宏哥如何处理前边文章中提到的反爬虫机制.今天跟随宏哥看一下java语言是如何处理的,已经按照之前的 ...