智灵班分班考 · Day1
时间线
- 8:00 在滨兰实验的远古机房中的一个键盘手感爆炸的电脑上开考。
- 开 T1,推了推发现可以 segment tree 优化 dp,由于按空格需要很大的力气导致马蜂被迫改变。后来忍不住了顶着疼痛按空格。
- 8:30 过了样例,但是没有大样例,先这样吧。
- 开 T2,发现每颗子树可以对应到序列上的一段区间,感觉可以区间 dp,但是怎么知道左右儿子的点的左右手写上什么呢?
- 苦思冥想到 9:45,思考无果打算打一个暴搜,暴搜过程中发现状态数可以直接从 O(n4)O(n^4)O(n4) 降到 O(n3)O(n^3)O(n3),但是我忘了转移还要 O(n)O(n)O(n) 导致我以为我莫名其妙获得正解,于是把暴搜加了个 O(n3)O(n^3)O(n3) 空间复杂度的记忆化数组(n≤500n\le 500n≤500)。
- 10:20 开 T3,一眼盯真,维护每个区间的支配点对,这只有 O(nlogV)O(n\log V)O(nlogV) 个,然后转二维数点;二维数点过程中推出了形如给定 [l,r][l,r][l,r],数 l≤u≤v≤rl\le u\le v\le rl≤u≤v≤r 的数量,脑子爆炸以为要数 (l,l)(l,l)(l,l) 到 (r,r)(r,r)(r,r) 的矩形,发明了一会儿二维 st 未果,最后注意到只要数 l≤u≤nl\le u\le nl≤u≤n,1≤v≤r1\le v\le r1≤v≤r 就可以了。
糖丸力 - 写完调完 T3 是 11:10,赶紧开 T4,一眼盯真,对 dfn 序维护线段树,线段树每个节点维护一个 01 Trie,单点修改就修改一整条链,查询正常查询,时空复杂度 O(nlognlogV)O(n\log n\log V)O(nlognlogV),赶紧冲!欸之前是不是过来说了啥 T4 某个样例要改一改?算了不管了。
- 写写写,11:45 分写完,测样例发现错了(其实是因为样例是错的),以为自己读错题了,爆裂鼓手,遗憾离场。
期望得分 100+60+100+70,实际得分 30+0+100+0。挂了 200 分,天下无敌!
总榜排名第 50,下一场需要翻 20+ 名。
题解 & 错因
T1
给定一个长度为 nnn 的数列 aaa,你需要选出若干个不相交也不相邻的区间(即任意两个区间中间至少隔一个元素),一个区间 [l,r][l,r][l,r] 能被选当且仅当 l=rl=rl=r 或者 ∀i∈[l+1,r]\forall i\in[l+1,r]∀i∈[l+1,r],满足 ai≥∑j=li−1aja_i\ge\sum_{j=l}^{i-1}a_jai≥∑j=li−1aj;求所有方案中区间中元素的最大和。
2≤n≤2×1052\le n\le 2\times 10^52≤n≤2×105,1≤ai≤1091\le a_i\le 10^91≤ai≤109。
设 f(i)f(i)f(i) 表示考虑完 [1,i][1,i][1,i] 的答案。注意到以 aia_iai 为选中区间右端点时,最长可选区间的左端点随着 iii 增大单调不降,于是可以双指针维护这个左端点。从 jjj 转移的式子是 f(i)←maxk<j−1f(k)+∑k=jiakf(i)\gets \max_{k<j-1}f(k)+\sum_{k=j}^ia_kf(i)←maxk<j−1f(k)+∑k=jiak,令 si=∑j=1iais_i=\sum_{j=1}^ia_isi=∑j=1iai 那么就是 f(i)←maxk<j−1f(k)+si−sj−1f(i)\gets \max_{k<j-1}f(k)+s_i-s_{j-1}f(i)←maxk<j−1f(k)+si−sj−1,令 g(j)=maxk<jf(k)−sjg(j)=\max_{k<j}f(k)-s_{j}g(j)=maxk<jf(k)−sj,线段树维护这个东西的区间最大值即可。时间复杂度 O(nlogn)O(n\log n)O(nlogn)。
为啥我挂成 30pts 了呢?赛时 g(j)g(j)g(j) 的表达式错误的认为是 f(j−1)−sjf(j-1)-s_{j}f(j−1)−sj,也就是坚定的认为只要隔一个元素。痛失 70pts。
#include <bits/stdc++.h>
bool MemoryST; using namespace std;
#define ll long long
#define mk make_pair
#define open(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define lowbit(x) ((x) & (-(x)))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define BCNT __builtin_popcount
#define cost_time (1e3 * clock() / CLOCKS_PER_SEC) << "ms"
#define cost_space (abs(&MemoryST - &MemoryED) / 1024.0 / 1024.0) << "MB"

最低0.47元/天 解锁文章
431

被折叠的 条评论
为什么被折叠?



