Day 1
A. Two Currencies
贪心选链上最小的几个收费站用银币付,显然是对的.
使用主席树加速贪心,复杂度 O(nlogn).
注意一条边上可能有多个收费站.
* B. Festivals in JOI Kingdom 2
我是计数菜逼./ll
首先,正确的贪心应该是将区间按照右端点升序排序贪心.下文中称正确的贪心为算法 A,假贪心为算法 B.然后再称被算法 A 选中的区间为 A 区间,被算法 B 选中的区间为 B 区间,不会被任何算法选中的区间为 F 区间.
这个时候是不是应该观察一下性质!设我们有 n 个区间 [l1,r1],[l2,r2],⋯[ln,rn],A 区间的下标序列为 a1,a2,⋯,ap,B 区间的下标序列为 b1,b2,⋯,bq,由于我们的贪心是对的,所以有 p≥q.
先来看算法 A,由于算法 A 按右端点升序贪心,可以观察到:
- 不存在 i,使得 ri<ra1.
- 不存在 i,j,使得 raj<li 且 ri<raj+1.
对于算法 B,类似地有:
- 不存在 i,使得 li<lb1.
- 不存在 i,j,使得 rbj<li 且 li<lbj+1.
显然,这是充要的.
然后我们尝试解决这个计数问题,发现直接计数很难,但是总方案数是可以算的,所以应当计算 p=q 的方案数.
这时候需要巨量观察,我先从官方题解中贺一张图:
其中红色区间为 A 区间,蓝色区间为 B 区间,紫色区间同时为 A 区间和 B 区间,未被染色的区间为 F 区间.
可以发现,在某个 p=q 的选择方案中:
- lb1≤la1,ra1≤rb1.否则不满足两个算法的条件 1.
- rai≤rbi.否则不满足算法 A 的条件 2.
- [lai,rai]∩[lbi,rbi]=∅.否则 [lbi,rbi] 会被算法 A 选中,此时不满足 p=q.
- rbi−1<rai,否则由于 rbi−1<lbi,不满足条件 3.
然后就可以开始设计 DP 了!我们大概需要设计一个这样的东西:每次插入一对 A、B 区间和若干 F 区间,然后在这一过程中计算方案数.
然后我们发现,如果我们按照两算法的选择顺序插入区间,为了满足上述所有条件,F 区间能够选择的左端点数会和前面的具体放置方案相关,必须要设计到状态里,做出一个类似线头 DP 的东西.但是 F 区间的右端点限制是非常松的:只需要在当前 A 区间右端点的右边.这启发我们倒序插入区间.
设 fi,0/1 表示插入了后 i 个区间,上次插入的 A、B 区间是否不同的方案数.转移枚举插 j 个 F 区间,使得这 j 个 F 区间的左端点在当前插入的 A 区间的右端点右边,分类讨论:
-
fi,1→fi+j+2,1.
此时要分两类讨论:
-
当前插入的 B 区间右端点在上一次插入的 A 区间左端点的左边,如图:
考虑 F 区间右端点的方案数:考虑逐个插入右端点,对于第 1 个插入的右端点,如图所示,可插入的范围中一共有 2(i−2)+1 个点,也就是有 2(i−2)+1+1=2i−2 个区间可供插入,而插入后又会新增一个区间,故插入一共 j 个右端点的方案数为 (2i−2)j.
再考虑安排 F 区间的左端点:由于右端点已经标号,所以左端点直接按序匹配就能不重不漏地统计所有方案,不用再次标号,而又由于 B 区间的条件 2,相邻 B 区间之间不能有左端点,那么方案数就相当于把 j 个球放入 3 个盒子中,盒子可空,即为 (3−1j+3−1)=(2j+2).
于是得到这种情况的转移:fi,1×(2j+2)×(2i−2)j→fi+j+2,1
-
当前插入的 B 区间右端点在上一次插入的 A 区间左端点的右边,如图:
发现转移和上面那种情况是一样的,可以直接合到一起转移!
于是得到这种情况的转移方程:
fi,1×(j+2)2×(2i−2)j→fi+j+2,1
-
fi,1→fi+j+1,0.
转移和 1 情况的差别只有左端点能够选择的区间数目变成了 2,故转移方程为:
fi,1×(j+1)×(2i−2)j→fi+j+1,0
-
fi,0→fi+j+2,1.
此时左端点只有 2 个区间可选,且右端点能选择的区间内只有 2(i−1)=2i−2 个端点,故转移方程为:
fi,0×(j+1)×(2i−1)j→fi+j+2,1
-
fi,0→fi+j+1,0.
左端点只有 1 个区间可选,且右端点能选择的区间内只有 2i−2 个端点,故转移方程为:
fi,0×(2i−1)j→fi+j+1,0
然后发现还有 F 区间左端点在第一个 A 区间右端点左边的方案没有统计,类似讨论即可.
时间复杂度 O(n2),在 loj 上能过.正解还要上个半在线卷积.
* C. Passport
可以注意到,由于签发国家总是被对应的可达区间包含,于是可达所有点等价于可达 1 和 n.
如果只用到达一边可以直接线段树优化建边跑最短路解决,但是现在要求到达两边的最小代价.有一个朴素的想法是,对点 i 分别求出到 1 的代价 c1,i 和到 n 的代价 cn,i,然后答案就是 c1,i+cn,i.这显然是错的,因为两段路径可能有交.
然后就不会了啊!看题解发现最优方案一定形如起点先到达某个中继点,然后再从中继点前往 1 和 n,然后就先将每一个点的答案初始化成 c1,i+cn,i,再跑一遍 01 bfs 松弛掉重复的部分.
Day 2
! A. Belt Conveyor
交互.以后再补.
B. Council
考虑如何求 i 的答案,先将 i 扣掉,此时支持人数 <⌊n/2⌋ 的议案已经寄了,>⌊n/2⌋ 的议案肯定能选到,于是只用考虑选取副议长对支持人数 =⌊n/2⌋ 的议案的影响.设 Si 表示 i 不支持 的议案的集合,T 表示当前支持人数 =⌊n/2⌋ 的议案的集合,我们要求的就是 j=imax∣T∩Sj∣.
这个可以两遍高维前缀和解决:先将每个 S 贡献到它的子集上,标记哪些子集是能产生的,然后再将这些子集大小贡献到它的超集上.注意由于有 j=i 的限制,需要记录来源不同的最大和次大子集大小.
* C. Mizuyokan 2
好牛逼.
首先发现,对于合法的一个划分,一定能够通过调整划分方案,使得作为谷的连续段长度为 1.
然后可以发现,如果我们划分出了若干段 [li,ri],使得对于所有 i,有 j=li∑riai>max{ali−1,ari+1},那么一定可以在此基础上调整出一个满足题意方案.显然这种划分和题目中给定的划分等价,拥有同样的段数上界.
下文中称将一个数选出来作为某个 ri+1 为选择这个数.由于要划分出尽量多的段,所以我们希望下一个选中的位置距离当前位置尽量近.设 nxti 为下一个选择的位置,再记 prei 为最大的 j,使得 k=j+1∑i−1ak>max{aj,ai},那么 nxti 就是最小的 j,使得 prej≥i.求出 nxt 后倍增就能过掉不带修改的包.
考虑带修改怎么做,这个时候有牛逼结论:
引理 1:nxti−i 是 O(logV) 级别的.
证明:
令 c=i+⌊logV⌋+2.考虑反证法,令该结论不成立,那么对于所有 i≤j<c,都有 aj≤k=j+1∑c−1ak,归纳一下可以得出,ai≥2c−1−iac≥2c−1−i≥2⌊logV⌋+1>V,矛盾.
然后就可以在线段树上维护每个区间前 O(logV) 个位置在区间内能够跳到的最远位置和步数.每次修改暴力重算有用的 pre 和 nxt 后重建线段树即可.时间复杂度 O(nlognlogV).
Day 3
* A. Chorus
感谢 这篇题解,感觉比官方题解更清晰!
将 A 看作 (,B 看作 ),题意就是经过最小次数的交换,使得能够划分出 k 个子序列,让每个子序列都形如 (((⋯))).
然后不会做了!看题解得知,无论如何划分,第 i 个 A 和第 i 个 B 一定匹配.也就是说,如果我们让第 l 个到第 r 个 A 在一个子序列中,那么第 l 个到第 r 个 B 也要再这一子序列中,且能够匹配也就是说必须被移动到第 r 个 A 后面.
设 cti 为第 i 个 A 前有多少个 B,那么划分出第 l 个到第 r 个 A 造成的代价就是 i=l∑rmax{cti−(l−1),0}.
然后就可以 DP 了!设 fi,j 表示前 i 个 A 划分出 j 段的最小代价,转移枚举上次划分在那里,容易做到 O(n3).然后发现这个代价函数满足四边形不等式,整个问题就是凸的了!wqs 二分套个斜率优化即可.
* B. Cookies
引理 1:对于选出的一组盒子,设将其大小从大到小排列后的序列为 b,那么这组选法合法当且仅当对于所有 i,有 j=1∑icj≤∑j=1nmin{i,aj}.
我不会证,但是可以感受!
于是可以设 fi,j,k 表示选了前 i 个盒子,考虑了大于 j 的所有盒子,当前方案和为 k.转移就是 fi,j+1,k→fi,j,k 和 fi−1,j,k−j→fi,j,k.
k 那一维使用 bitset
优化转移.
C. Tourism
套路世界大战!
可以求出区间内每一个点到根节点的路径并大小,然后减去区间 LCA 到根的路径大小,就是区间虚树覆盖的点集大小.
区间 LCA 可以通过查询区间 dfn 最小值和最大值,求它们对应点的 LCA 解决;路径并大小是经典套路,拿一个 LCT 然后扫描线,access 一下新加的点,每次虚实边切换时撤销上次的贡献并插入当前的贡献,复杂度 O(nlog2n).
Day 4
! A. The Last Battle
通信.以后再补.
! B. Security Guard
看不懂题,摆了.
C. Bitaro’s Travel
首先已经到达过的点一定是一段连续的区间,然后每次转向时,这个区间长度至少翻倍.
模拟转向即可.转向点可以二分.