把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

IOI2020 国家集训队作业乱炖

AGC035D Add and Remove

有意思。

发现第一个和最后一个是不动的,因此可以直接加上这两个的值。

我们设 dpl,r,x,y 表示区间 [l,r],放到左边的值对答案贡献为 x,放到右边的值对答案贡献为 y,对答案的最小贡献。

容易发现 x,y 只和左右两边选择的先后有关,因此状态数是 (n(rl+1)l1) 的,所以总状态数是 O(2n) 的。

submission

CF607E Cross Sum

我们考虑首先求出第 m 大。考虑二分,然后有一个以询问点为圆心的圆。考虑每条直线对圆的两个交点构成的弧,如果两个弧互不包含地相交了,那么这两个弧对应的直线的交点就在圆内,容易树状数组求这个数量。

然后输出答案的话把树状数组换成 set 即可,用 set 的 iterator++ 可以做到均摊 O(1),注意特判边界。

复杂度 O(nlognlog1ϵ+m)

submission

AGC027E ABBreviate

首先有个典中典的转化:把 a 看成 1,把 b 看成 2,则序列总和 mod3 不变。

然后我们发现,最终序列中一个位置要对应原序列的一个区间。所以我们考虑一个长什么样的区间可以转化成其总和对应的字符。

首先一个显然必要的性质是需要有相邻位相同,所以我们先把原序列没有相邻相同判掉。然后我们发现这玩意就充分了。

具体可以对序列长度归纳证明:

  • 首先我们手玩对于所有 n3 的情况,发现都是满足的。
  • 对于序列长度 n4 的情况,如果序列中所有数都相同,那么显然可以使序列长度 3。否则找一个连续的长度 2 的相同段,那么这一段左右端点不是边界的一侧做一次变化,就可以使序列长度 1,并且仍然存在相邻相同。

因此,我们得到了一个区间转化成一个字符的充要条件。然后我们还可以发现,如果目标序列的每个字符对应到原序列的区间存在一种不交的方案,那么这个对应方式就是满足条件的,具体证明可以找一对初始相邻相同的调整,我觉得显然就不证了。

因此可以写一个类似于子序列自动机的 DP,时间复杂度 O(n)

submission

AGC036D Negative Cycle

考虑用差分约束刻画这个东西,没有负环等价于存在一种给每个点的赋值方案,满足剩下的每条边,有 ai+waj

因为 ii+10 边不能删,所以 ai 需要满足 aiai+1

然后你发现因为边权只有 11,并且方向都是固定的,所以一条边能否存在只取决于 aiaj+1 的大小关系。这样你只需要设 dpl,r 表示 [l,r] 区间内的数相同,转移的时候枚举下一个值对应的区间端点,前缀和即可做到 O(n3) 转移。

submission

AGC028D Chords

考虑计算每个联通块的贡献和。一个联通块在下标上有最大和最小的两个点,考虑枚举这两个点,计算联通块的两端点以这两个点为端点的方案数,记作 dpl,r

首先 [l,r] 区间内与区间外是不能有连边的,所以外面的方案数可以单独乘上去。然后内部可以用全部的方案数减去 [l,r] 不联通的方案数。如果不联通,枚举包含 l 的联通块的最右端点即可。

类似区间 DP 转移,时间复杂度 O(n3)

submission

AGC024E Sequence Growing Hard

把值域看成 [1,k],第 0 位置看成 0

考虑每次插入的时候,如果在 x 位置插入一个比原来 ax 大的数,那么显然是满足条件的。如果插入的是比 ax 小的数,那就寄了。如果是等于 ax 的数,那么插入在 x 位置与 x+1 位置是一样的,所以不妨放到后面考虑。所以我们现在的操作只有:选择一个位置,插入一个比这个位置大的数。

然后就好做了。我们设 fi,j 表示有 i 个数在第一个数的基础上插入得来,第一个数为 j 的方案数,容易用前缀和优化成 O(n3)

submission

ARC091F Strange Nim

只需要将其 SG 值求出来即可。

首先我们手玩一下会发现,如果 aimodki=0,则这个位置的 SG 值为 aiki,否则这个位置的 SG 值等于 aiaiki1 位置的 SG 值。

k2>ai 的时候,发现会有很多重复的操作,将其合并即可。当 k2<ai 的时候,一次操作至少会让其减少 aik,所以复杂度是 O(min(k,ak)) 也即 O(a) 的。

submission

ARC096E Everything on It

想错了把题目做复杂了一万倍/cf

首先我们需要容斥,枚举有多少个位置放了 1 个,剩下的随意放,乘以容斥系数。

然后考虑设 dpi,j 表示将 i 个数(可以不选)合并成 j 个集合的方案数,这个只需要稍微改一改第二类斯特林数的 O(n2) 递推就行。

这样的话我们枚举 i 个数凑出了几个集合,然后要么和前面的集合拼成另一个集合,要么单独成为一个集合,这样计数可以做到 O(n2)

submission

CF1336E Chiori and Doll Picking

不错的正交线性基题。

首先将所有数扔到线性基里,不是基底的数对所有数都有 ×2 的贡献。

现在对基底的数量分讨,若基底的数量 m2,则暴力枚举即可。否则,将原线性基转化为正交线性基。

设原线性空间为 A,正交之后的线性空间为 A,则 [xA]=1|A|yA(1)x·y

根据上面的式子,我们只需要求出 A 中每个数的 1 的个数,就可以 O(m3) 计算出原线性基中各个 1 的出现次数了。

时间复杂度 O(nm+2m2+m3)

submission

ARC096F Sweet Alchemy

一个复杂度更优秀的算法。

首先考虑差分成计算 ci 表示 i 比其父亲多选了几个。特别的,对于 i=1,表示 1 选了几个,并重新计算每个点的代价为其子树内的代价和,收益为子树内的点的个数。

我们注意到代价的上限是 109,但是单个物品的收益只有 n。对于这种问题,我们考虑进行数位 DP。

先将每个物品的 D 次二进制拆开,拆成不超过 2logV 个物品,且对于每个 i,选了 2i 个的物品只有至多 2 件。然后从高到低考虑每一位。设 dpi,j 表示考虑到第 i 位,第 i 位往上的收益之和是 2ij,的最小代价。

我们注意到,在所有比第 i 位更小的物品的收益之和不会超过 n(n+1)2i,因此,设当前 DP 状态中最大的合法的 jm,则我们可以只保留 [mn(n+1),m] 范围内的状态,这样子状态的个数就不会超过 O(n2),总的复杂度就是 O(n3logV) 的。

进一步的,如果使用其它题解所使用的“前 i 个物品背包,后面直接贪心”的思路,复杂度可以做到 O(n3logn),但是没有什么必要。

submission

CF671D Roads in Yusland

这玩意居然还有不是线段树合并的做法!

强上线性规划,对偶成给每条边赋一个值,要求一条路径上边权和 权值,且边权和最大。

直接贪心就行了,用启发式合并堆维护,复杂度 O(nlog2n),用可并堆可以做到 O(nlogn)

submission

CF679E Bear and Bad Powers of 42

感觉比较神秘的一个题,感觉证出来复杂度是 O(nlog2nlog42v) 的但是题解都说是 O(nlognlog42v) 的(

我们主要考虑怎么维护第三个操作,发现如果我们能在线段树上每个节点维护这个区间内到每个 42 的幂次最近的数,那么就可以判断有没有一个 42 的幂次了。

但是我们这样子维护没有办法很好地叠合加法标记,因为这可能会造成某些离某个幂次更近的数变掉。

我们发现,对于一个连续的,相同的段,其只会变成 42 的幂次最多 O(log42v) 次,因此,如果我们加法的时候暴力走,直到区间内加法不再改变离每个幂次最近的数,或者这个区间有覆盖标记,就可以叠合这个加法标记了。

考虑线段树上每个区间,其会被暴力修改 O(log42v) 次,并且需要在线段树上定位它,所以其复杂度是 O(lognlog42v) 的。每次操作会产生 O(logn) 个区间,所以总复杂度 O(nlog2nlog42v)

submission

AGC023E Inversions

先考虑合法的排列数怎么算,这个是简单的,只需要按照 A 从大到小考虑,把合法的点顺次乘以系数。

然后考虑,我们先计算 A 序列的逆序对数,然后在此基础上进行一定量的修正。对于 AiAj 的数,其对全部逆序对的贡献是把 Aj 看成 Ai 之后的排列数的 12,对于 Ai>Aj 的数,其多算的逆序对数是将 Ai 看成 Aj 后的排列数的 12,容易用树状数组维护。复杂度 O(nlogn)

submission

AGC034F RNG and XOR

我们把过程反过来,计算 i 变成 0 的期望步数。设概率数组为 A,最后的答案数组为 B,则有 AB+I=B+c,其中 I 是一个全部为 1 的数组,c 是一个修正 A0 的常数。

考虑对其作 FWT 变换,考虑其 i=0 项,有 B+2n=B+c,解得 c=2n

因此可以直接将其转化为点值,然后求逆。对于i=0 的位置可以待定系数。复杂度 O(n2n)

submission

AGC035C Skolem XOR Tree

构造题怎么做?

注意到 (xxor1)xor1=x,因此,如果 n3n 是奇数,则对于每个偶数 x,连边 (1,x),(1,x+1),(x+n,x+1),(x,x+n+1) 即可。最后把 (n+1,n+2) 连上去。

如果 n 是偶数,并且 n=2k 那么无解。否则总能找到 xxoryxor1=n,连上去就行。

submission

CF1770F Koxia and Sequence

感觉有点牛的题!

序列上每个位置是本质相同的,所以每个位置出现每个数的方案数是一样的,所以如果 nmod2=0 那么就是 0,否则答案就是所有合法序列上 a1 的异或和。

考虑枚举 a1 的某一位,钦定其出现,然后枚举 y 的子集容斥掉 or 恰好为某个值的方案数,就是说枚举一个 yy 并且要求选择都在 y 内,然后把所有 y 的结果 xor 起来。

现在我们要求:每个点都在 y 内,第一个点必须选 2i,然后要求所有数的和为 n,求方案数 mod2

然后就是最牛逼的一步了:我们要求所有 aiy,那么可以将其写成 (yai)mod2,然后用范德蒙特卷积卷起来就变成 (ny2ix2i)mod2,也就等于 x2iny2i 了,就可以 O(1) 计算,复杂度 O(ylogy)

submission

AGC026F Manju Game

感觉这个题有点牛的。

首先考虑 n 是偶数怎么做。容易发现,只要先手选第一个或者最后一个,其收益不会小于 max(a2i,a2i+1)。另一方面,考虑先手选了某个位置 x,则后手显然可以找到一边,使得主动权到后手手上,这样先手的得分不会超过和 x 同奇偶性的数之和。因此,先手的得分就是 max(a2i,a2i+1)

然后考虑 n 是奇数,如果先手选了一个奇数位置,则后手可以任取一边将主动权掌握到自己手上,这样先手的得分不会超过 a2i+1。但是先手选了偶数位置的时候,后手没有办法让主动权掌握到自己手上。

这个过程其实可以看做,先手选了一个偶数点,然后后手在某一边选了所有奇数,先手拿了所有偶数。并且先手可以随时选择拿剩下所有奇数跑路。

Δ 表示先手最后的答案比所有偶数和大了多少。现在我们来考虑如何判定一个 Δ 是否可行。你会发现,要存在一种划分方式,使得选择了若干个偶数点,且任意相邻两个偶数点之间,奇数位置减偶数位置要Δ。所以我们考虑二分这个 Δ,然后去 DP check。转移之只和 sumrsuml1,因此只需要记录合法的 suml1 的最小值即可做到 O(n) 单次。总复杂度 O(nlogai)

submission

AGC031D A Sequence of Permutations

p×q 为排列 p 对排列 q 的复合,也即 ai=qpi,则 f(ai,ai+1)=ai1ai+1

列出前几项,可以发现,

a1=pa2=qa3=p1qa4=q1p1qa5=q1pq1p1qa6=q1ppq1p1qa7=q1pqpq1p1qa8=q1pqp1qpq1p1qa9=q1pqp1p1qpq1p1qa10=q1pqp1q1p1qpq1p1q

an=q1pqp1an6pq1p1q,证明这个不难,只需要发现左边那个是不动点即可,然后快速幂就做完了。

submission

AGC027D Modulo Matrix

特化,特化,特化!

我们发现直接对这个东西做似乎无从下手,于是我们考虑奇偶染色,黑色放大的,白色放小的,大的直接取周围一圈小的的 LCM。

直接放是 1020 级别的,但是我们考虑再特化一下:按照斜线填小的,每次找一个大于 n 的质数然后依次填这个质数的倍数。

注意到一个点周围只有 2 中质数和 3 种倍数,因此值域是 O(n5log2n) 的,卡卡就过了。

submission

AGC022D Shopping

首先显然可以先将每个点的时间模掉 2L,直接加到答案里面去,然后肯定要有一个 0L0 的来回,所以再加上 2L

我们发现,这样子以后商场可以分为四种:

  1. 无论火车往哪边开,在这个商场购物之后火车都会反向,加上一个 L

  2. 无论火车往哪边开,在这个商场购物之后火车都会往左,但是,如果从左边进来,那么贡献一个 L,否则贡献两个 L

  3. 同上,对称情况。

  4. 无论火车往哪边开,购物之后火车还是原来方向,加上两个 L

第四种可以直接算答案,现在剩了三种。

我们发现,如果一个 2 情况在右边,一个 3 情况在左边,那么将这么一对 2,3 匹配起来是优的,相比于分开走会小一个 L1 可以任意当做 2,3 匹配,因此我们的目标是让匹配最大。因此我们先让 2,3 匹配,然后让 12,3 匹配,最后让 1 内部匹配即可。容易用栈维护做到 O(n)

submission

AGC033E Go around a Circle

首先我们考虑单个点怎么判定,然后你会发现你啥都判不出来。

所以这个东西的性质肯定和全部满足有关。假设 s1R,如果不是全部取反答案不变。

这样,就不能有两个连续的 B。如果 s 全是 R,那么这个条件就是充要的了,特判掉。

之后就肯定要有一个 B 了。然后我们发现,如果一段 R 的长度为偶数,那么每个点往两边走到第一个 B 的奇偶性是一样的,所以会出现在开头走不过去的情况,因此,R 的连续段长度为奇数。

然后你会发现,这样子带来一个非常好的性质。考虑现在 s 序列中有一个 B,那么当前点要经过一个 B,但是对面的点也要经过一个 B 过来,因此可以看做不变。同时,经过奇数/偶数个 R 也是一样的分析,因此我们不用考虑移动带来的影响。

另外,如果 s 中有一段连续的 R 长度为奇数,那么这一段连续的 R 需要走到对面去才能把奇偶性调整对,这样的话任意一段 R 的长度都不能超过 s 中奇数长度的 R 的长度,但是结尾的 R 不需要考虑。同时,s 中开头的一段 R 如果长度为偶数,也会对 R 的长度进行限制,因为一开始要从这里面走出来,需要特判。

因此,我们只需要设 fi 表示长度为 i 的,两头都是 B 的合法串有几个,然后最后枚举被截断的长度合并即可。容易前缀和优化到 O(n)

submission

AGC038F Two Permutations

转换看上去是比较平凡的,这里讲建图。

我们需要解决的问题是,有若干个环,每个环可以选择 i 或者 pi。有若干限制,可以表示为,若两个环都改变,贡献 +1,或者两个环都不改变,贡献 +1,求最小贡献。

这个东西看上去非常文理分科啊,于是我啪的一下很快啊拍了个文理分科上去。

然后 WA 了。原因是文理分科并不能做最小值的情况。

我们需要注意的是这个题有没有特殊性质,可以发现的是,限制的图是一个二分图。

则,我们让 q 对应的意义取反,也即如果和 S 相连,那么代表改变了,如果和 T 相连,代表没有改变,然后就发现能用了。

submission

ARC092F Two Faced Edges

我们发现,翻转一条边 uv 带来 SCC 改变,只有两种情况:

  • u,v 不在一个 SCC 内,且去掉 uv 这条边以后,u 仍然能到 v,这种情况 SCC 数目 +1
  • u,v 在一个 SCC 内,且去掉 uv 这条边以后,u 不能到 v,这种情况 SCC 数目 +1

究其根本,我们需要对于每条边 uv,求在去掉 uv 的边以后,u 是否仍然能到达 v

枚举 u,从小到大枚举 u 的每个出边,进行一个搜,不能走到之前已经搜过的点,更新上面的可达性。

我们发现,这样子已经能够处理,uv 的路径中第一步走的在这条边前面的边了,则再翻转一次做一遍就行。

复杂度 O(nm) 或者 O(n3+m)

submission

AGC036E ABC String

猜一猜就行了……

假设 A 的数量小于 B 的数量小于 C 的数量。

具体的,先删 BCB 中的一对 BC,如果B 的数量和 A 不等那么肯定有 B 在开头结尾,删掉。

然后再删开头结尾的 C 以及 ACBBCA 中的 C,然后再删 cCcAACBC 掉就行。

证明能找到这么多对是可以乱画的……

submission

AGC035F Two Histograms

手玩一下,会发现,如果存在 ki=j,lj=i1,则替换成 ki=j1,lj=i 方格中的数是不变的。

猜测不存在这样的结构就两两不同,感性理解一下这样很对。

如果我们先不管证明,考虑如何计算这个东西:枚举有多少对 (i,j) 满足这个条件去容斥,这样就是从 n 个中选 i 个出来,从 m 个中选 j 个出来,然后配对一下,剩下的任选即可,复杂度 O(n+m),写了一下发现过了。

但是这个为什么是对的呢?

反证,假设满足上述条件的一对 (k,l)(k,l) 生成的网格相同。

找到最后一个满足 lili,不妨假设 li<li,则要满足 kli+1i,kli+1<i。 又因为 kli+1i,所以 kli+1>i

这样的话,(li+1,i+1) 处双方生成的网格不相同,矛盾,所以只要满足不存在这样的结构,就会生成两两不同的网格.

submission

CF708D Incorrect Flow

粗一看这个东西很上下界网络流,于是考虑从这个角度去思考。

先给 1,n 两个点之间连一条边,让这条边容量无限,流量初始为 0,并且增加流量不需要代价。这样子所有点就都流量平衡了。

我们让一条边正着流表示 fi 变大一个,反着流表示 fi 变小一个,如果代价都是正的,那么显然不会同时正着和反着流。

考虑计算每个点在现行流量下的流量平衡情况,记入度减出度为 di。若 di>0,表示 di 需要新增一些出度与删掉一些入度,总和为 di。注意到在上面的定义下,这等价于增加 di 个流量,因为反着流就表示减小,正着流就表示增加;对于 di<0 同理。

然后对于一条边流量的费用,需要根据容量和流量的关系分讨一下,这样可能会出现一条边费用分段的情况,但是分段的情况费用单调递增,所以没有关系。

跑个最小费用最大流就做完了,时间复杂度为 n 个点,m 条边,流量 nV 费用流的复杂度,但是这个复杂度真的过得去吗

submission

AGC037D Sorting a Grid

考虑倒着模拟回去,如果 D 是有序的,那么 C 需要每一行的数的集合正确,则 B 中每一列中每一行恰好有一个。

考虑增量构造,每次构造一个列,这个可以直接二分图匹配。

但是这样为什么对?我们试图证明,对于任意一个 n×m 的矩阵,其中 n 种数每种数恰好有 m 个,都能在每一行中选择一个数,使得所有选出来的数构成的集合是全集。

考虑 Hall 定理,枚举一个数的集合,观察有这些数的行的集合。因为一行至多只能放 m 个数,因此 x 个数所对应的行至少有 x 个,因此存在完美匹配。

使用不同的匹配方法可以做到 O(n4)O(n3.5)

submission

AGC029F Construction of a tree

感觉是比较高明的流子题。

首先我们观察一下,如果 x 个集合的并大小不超过 x,那么就无解了,因为这样的话这 x 个点就至少有 x 条边,一定成环。

盲猜一手这个就是充要条件,然后考虑构造性证明。

你会发现这个判定就是一个二分图匹配,所以肯定要流。我们定 n 为根,然后对于每个集合,选两两不同的点,表示这个集合的边的两个点中更深的点。

然后从 n 开始搜,比如当前处理的是 x,如果一个集合没有被定过较浅的点,并且其集合内有 x,就直接把 x 定做较浅的点,连这一条边。

考虑什么时候构造不出来,这样的情况没有被处理的集合中,均没有已经处理过的点。

但是这样的话你会发现,没有被处理过的集合的并不超过其选择的点集的大小,也就满足了无解的充分条件,所以肯定无解。因此对于有解方案总能构造出解,也就证明了上面那个条件是充分的。复杂度是二分图匹配的 O(mn)

submission

AGC036F Square Constraints

首先你可以求一个 [li,ri] 表示 pi 要在哪个区间内,然后相当于对满足这些条件的排列计数。

直接做感觉是不能做的,于是考虑它给的条件有什么性质。

我们考虑容斥一下,枚举一些点,强制让其 lx1,然后容斥系数是 1 的这样的个数次方。

这样就都是小于了。如果这些值是确定的,那么可以直接排序,然后把 aii+1 全部乘起来就行了,但是它并不有序。

另外,你观察到 lr 是分别有序的,但是好像并没有什么用。

观察一下 r[n,2n) 范围内的最大值,也即 rn 处的值,发现是 3n,然后观察 l 的最大值,发现是 n,然后你发现 [n,2n) 范围内是没有下界,不需要容斥的。所以先枚举一下 [0,n) 有多少被容斥的,这样如果确定了 (i,n) 中有多少个被容斥了,那么 i 是否容斥的系数都是容易计算的,因此将 [0,n)li1[n,2n)ri 归并以后就可以 DP 了。复杂度 O(n3)

submission

AGC025D Choosing Points

一个简单但是有趣的结论:将距离为 d 的点连边,构成二分图。

考虑按照 dmod4 余数分讨证明:

  • dmod4=1:两边长为奇数+偶数,按照 x+y 奇偶性分。
  • dmod4=3:没这种情况。
  • dmod4=2:两边长为奇数,按照x 奇偶性分。
  • dmod4=0:两边长为偶数,除二归纳。

然后直接对两种分别染色,取最大的一定满足要求。

submission

AGC039E Pairing Points

感觉这种题就看你能不能枚举到适合 DP 的结构了!

首先拍到序列上,一条边看成一个区间,则两个边相交当且仅当区间相交但不完全包含。

枚举 1 和哪个点连边,则我们需要计算 fi,j,k 表示 [i,j] 区间,并且 k 和区间外某个点有连边,区间内连成联通块的方案数。

我们发现,跨立 k 的连边只能是互相包含的结构,因此我们枚举最外面的一条边,设为 x 连向 y,再在 [x+1,k] 中枚举一个分界点,分界点左边和 x 连通,分界点右边和 k 联通,同时在 [k,y1] 之间也枚举一个,然后发现变成了三个子问题,就可以计算了。

上面状态是 O(n3) 的,转移是 O(n4) 的,总复杂度是 O(n7) 的,有若干比较显然的优化成 O(n5) 甚至更低的办法,但是没有必要因为 O(n7) 只需要跑 30ms。

submission

AGC039F Min Product Sum

首先有一个 DP:设 fk,i,j 表示从小到大填到了 k,现在有 ij 列已经被确定了最小值的权值和。

直接硬转移不太好做,我们考虑容斥。但是如果同时对两维容斥又不好做了,所以我们只对一维容斥。

我们将 i 的扩展分为两步:枚举一些行,不作限制,与枚举一些行,钦定每行都没有 k,乘上这类的容斥系数。

先枚举第一种转移,这是容易算清楚系数的。然后转移列,枚举有多少列是有 k 的。因为剩下再转移的行已经钦定没有 k 了,所以现在的每列都要有一个 k,需要减去全部 >k 的方案。最后转移没有 k 的行,贡献也容易计算。

然后就做完了,O(nm(n+m)k),需要卡一卡常。

另外有个很牛的做法是,转化成同时填两个矩阵 A,B,使得 Bi,j 小于 Ai 行最小值与 j 列最小值,然后转化成 Bi 行最大值小于 Ai 行最小值,Bj 列最大值小于 Aj 列最小值,这样行列相对独立,也可以做到 O(nm(n+m)k)

submission

AGC028E High Elements

首先我们发现,如果原序列中某个位置是前缀最大值,那么分了之后肯定是前缀最大值,我们特殊观察一下这种数。

如果我们已经确定了这样的前缀最大值属于哪边,然后考虑剩下的非前缀最大值的分配。对于一个前缀最大值,假设其被分配到 A 序列中,那么它之后一段直到下一个前缀最大值内的数都是可以任意分配给 B 序列而不影响 A 的前缀最大值的。所以,当前缀最大值的分配方式确定之后,A,B 序列的前缀最大值是一个包含已经分配的前缀最大值的上升子序列,并且对于不是原序列前缀最大值的部分,其互不干扰。

对于字典序的问题我们需要考虑判定。根据上面的结论,可以说明的是,如果存在满足要求的分配方式,则存在一种分配方式,使得其中一边的前缀最大值都是原序列的前缀最大值,因为显然如果两边都有可以两边同时删去。

将直接选原序列的前缀最大值的情况判掉之后,我们枚举一边,钦定其存在不是原序列前缀最大值的前缀最大值,不妨假设 A 序列存在这样子的数。

记权值为 A 序列前缀最大值减去 B 序列前缀最大值,目标是判定是否存在权值等于某个数的分配方式。先来考虑这个权值的上界,是将剩下的序列中,前缀最大值的价值为 2,非前缀最大值的价值看成 1 的最长上升子序列,并且子序列中要包含非前缀最大值。

然后我们惊奇地发现, 0 到这个上界的所有值都是可以取到的!因为考虑从这个上界开始调整,不断删除前缀最大值点直至没有或者恰好大 1,这时再用权值为 1 的点补齐即可。

这样只需要一个线段树来做最长上升子序列就行了。时间复杂度 O(nlogn)

submission

AGC039D Incenters

被平面几何搏杀了。

设原点为 O,三个点为 A,B,C

性质1:记三条角平分线与单位圆交于 D,E,F,则 ABC 的内心 IDEF 的垂心。

性质2:对于三角形 ABC 的外心 O,重心 G,垂心 H,有 OH=3OG

第一个倒一下角就行,第二个可以相似。

则三角形内心就是三条弧中点相加,这个容易 O(n2) 做。

submission

CF575E Spectator Riots

真的一点不会计算几何!

画画图就可以发现,实际上一定存在一个圆满足其能包含所有标记点。

假设我们现在有一个圆 O,是 ABC 的外接圆,有一点 D 不在圆内,假设四边形 ABCDAD 为对角线。

由圆的性质,有 ADC<ABC,所以,将外接圆改成 ACD 的外接圆之后,现在的外接圆包含了原来的外接圆,所以一定存在一个外接圆包含了所有点。

现在问题变成从若干个点中找三个点外接圆最大。

如果某一个点不在凸包上,显然是不优的。现在来考虑三个点都在凸包上的情况,我们猜想,这三个点在凸包上相邻。

证明不想写了,可以看 yhx 写的证明

然后只需要求凸包就行,半径可以用 4S=abcR 反推,复杂度 O(nlogn)

submission

AGC032F One Third

首先,我们固定第一刀的位置为 0,然后考虑剩下的刀切在哪里。

我们做一个转化,将每一刀原来的位置标记为蓝色,旋转 23π 之后的刀标记为红色,再转 23π 的刀标记为绿色。则我们取 [0,23π] 内的刀,我们实际上求的就是异色刀之间最小的距离。

这显然会在相邻的刀之间取到。假设我们已经知道了在 [0,1] 上撒 n1 个点,分割出的 n 段区间中大小第 i 小的区间长度为 f(n,i),则答案就是 i=1n2+[i==n]3if(n,i) ,也就是枚举第几个是异色的。

现在问题在于求 f(n,i),先打个表,发现 f(n,1)=1n2

证明考虑计算 P(X) 表示撒 n 个点最小的距离 X,这相当于在 1nX 上撒 n 个点,所以 f(n,1)=01n(1nX)ndx=1n2

然后考虑根据这个写一个递推式。第二大的相当于每个长度都减去 1n2 ,然后去掉一个之后的最小,所以有 f(n,k)=1n2+n1nf(n1,k1)

这时候需要一点猜想,然后归纳。结论是 f(n,k)=1ni=1k1ni+1,然后就容易 O(n) 做了。

submission

AGC033F Adding Edges

首先我们发现,如果我们的边存在 a,b,c 在树上同一条路径依次排布,并且 (a,c),(b,c) 都存在,则可以将 (a,c) 换成 (a,b),显然不影响答案。

这样子的变换显然不会无限进行下去,最后我们会得到一个图,满足一个点 a 的任意两条出边 (a,b),(a,c) 中,不存在 a,b,c 在某一条路径上依次排列。

那么这样子,路径只能越合并越长,所以可以直接计算。模拟上述过程,时间复杂度 O(nm)

submission

AGC031F Walk on Graph

这个题怎么这么牛!我感觉我再长十个脑子都不够!

首先我们将这个走的形状反过来,让它从终点往起点走,那么每次就变成 ×2 再加上边权。

(x,u)(y,v) 表示在 x 号点,权值为 u,能走走到 y 号点,权值为 v。我们来证明,可达关系是双向的。

我们只需要证明走完每条边的状态都是双向可达的即可。设边权为 w,则有 (x,u)(y,2u+w),若走了 2t 次,则会来到状态 (x,u22t+w(22t1)),令 t=φ(mod) 即可走到状态 (x,uw),然后再这样走 mod 次即可走回 (x,u)

然后,我们考虑一个点的两条出边,(x,y1,w1),(x,y2,w2),若走 xy1x,会得到状态 (x,4k+3w1),走另一条会得到 (x,4k+3w2),也即可以看成 可以从 (x,u) 走到 (x,u3(w2w1))。如果我们取所有有相同端点边权差的 gcd,令其为 g,则 modgcd(3g,mod) 同余可以任意移动。

现在有一个好处,是所有边 modg 都是同余的。记余数为 r,假设我们将所有边都减去 r,并将起点权值加上 r,则每次走过一条边会变成 2(u+r)+w1r=2u+w1+r,仍然大 r,因此作此变化以后,所有边都是 g 的倍数了。

如果现在这样建点并查集合并复杂度还是爆炸。我们考虑 (x,u)(x,4u+3w) 的变换,在 modgcd(3g,mod) 下已经变成了 (x,u)(x,4u)。考察 uumodgg,这东西 ×4 以后在 modgcd(3g,mod) 情形下是不变的,所以可以看做对 umodg 乘了个 4,因此我们只需要知道我们经过了奇数还是偶数条边。

最后,我们的建立的点只需要存点标,经过边的奇偶性,以及 uumodgg 的值,后面两个范围一个是 2 一个是 3,因此并查集只有 O(n) 个点,复杂度整体是 O(nα(a)+mod) 的。

submission

posted @   275307894a  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
历史上的今天:
2022-04-08 UOJ #399. 【CTSC2018】假面
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示