2025 XYD Summer Camp 7.21 智灵班分班考 · Day1

智灵班分班考 · 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 500n500)。
  • 10:20 开 T3,一眼盯真,维护每个区间的支配点对,这只有 O(nlog⁡V)O(n\log V)O(nlogV) 个,然后转二维数点;二维数点过程中推出了形如给定 [l,r][l,r][l,r],数 l≤u≤v≤rl\le u\le v\le rluvr 的数量,脑子爆炸以为要数 (l,l)(l,l)(l,l)(r,r)(r,r)(r,r) 的矩形,发明了一会儿二维 st 未果,最后注意到只要数 l≤u≤nl\le u\le nlun1≤v≤r1\le v\le r1vr 就可以了。糖丸力
  • 写完调完 T3 是 11:10,赶紧开 T4,一眼盯真,对 dfn 序维护线段树,线段树每个节点维护一个 01 Trie,单点修改就修改一整条链,查询正常查询,时空复杂度 O(nlog⁡nlog⁡V)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_jaij=li1aj;求所有方案中区间中元素的最大和。

2≤n≤2×1052\le n\le 2\times 10^52n2×1051≤ai≤1091\le a_i\le 10^91ai109

f(i)f(i)f(i) 表示考虑完 [1,i][1,i][1,i] 的答案。注意到以 aia_iai 为选中区间右端点时,最长可选区间的左端点随着 iii 增大单调不降,于是可以双指针维护这个左端点。从 jjj 转移的式子是 f(i)←max⁡k<j−1f(k)+∑k=jiakf(i)\gets \max_{k<j-1}f(k)+\sum_{k=j}^ia_kf(i)maxk<j1f(k)+k=jiak,令 si=∑j=1iais_i=\sum_{j=1}^ia_isi=j=1iai 那么就是 f(i)←max⁡k<j−1f(k)+si−sj−1f(i)\gets \max_{k<j-1}f(k)+s_i-s_{j-1}f(i)maxk<j1f(k)+sisj1,令 g(j)=max⁡k<jf(k)−sjg(j)=\max_{k<j}f(k)-s_{j}g(j)=maxk<jf(k)sj,线段树维护这个东西的区间最大值即可。时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)

为啥我挂成 30pts 了呢?赛时 g(j)g(j)g(j) 的表达式错误的认为是 f(j−1)−sjf(j-1)-s_{j}f(j1)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"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值