CF1491
C
好坑啊。
访问到 \(i\) 之后多余的传给 \(i+1\)
对于 \(2\sim i+a_i\) 直接 \(+1\)
清空数组需要清空到 \(n+1\)
D
按照二进制位排序序即可。
需要判断一下是否 \(u<v\)
E
定义一棵树是好的当且仅当其大小为 fib 数列,且以下两个条件满足至少一个:
- 大小为 \(1\)
- 可以割去一条边变成两棵 fib 树。
判断一棵树是不是好的,\(n\le 2\cdot 10^5\)
Solution
最多只有两个合法的割点,可以证明如果合法则随便割一个即可。
证明:
归纳:设 \(f_k\) 时成立,那么考虑 \(f_k+f_{k-1}\),此时 \(f_{k+1}\) 处存在两条割边分别为 \(f_{k-1}\) 和 \(f_k\) 内的 \(f_{k-1}'\)
割去 \(f_{k-1}\) 必然是合法的,对于 \(f_{k-1}'\) 的情况,不难证明也是合法的。
这是因为这个结论对于 \(f_k\) 成立,因此割除 \(f_{k-1}'\) 后其分裂为 \(f_{k-2}'\) 和 \(f_{k-1}'\) 的两个 Part,其中 \(f_{k-2}'\) 和 \(f_{k-1}\) 相邻则可以得到一棵大小为 \(f_k\) 的合法的树。(如果不相邻则说明 \(f_k\) 子树内无 \(f_{k-1}'\))
F
交互题,有 \(n\) 个元素,权值为 \(-1/0/+1\),你需要确定所有权值为 \(0\) 的下标位置。
每次可以查询两个不相交的集合 \(S_1/S_2\),交互器将输出 \(w(S_1)w(S_2)\),其中 \(w(S)\) 表示集合 \(S\) 内部的权值和。
在 \(n+\log n\) 次操作内完成此任务。
\(n\le 2000\),保证至少有一个 \(0\),至少有两个非 \(0\)
Solution
假设得到了一个非 \(0\) 的元素,那么只需要询问 \(n\) 次即可。
我们考虑每次询问 \(i\) 和 \([1...i-1]\),此时显然我们第一次得到非 \(0\) 的输出时即为第二个 \(\pm 1\) 的位置。
只需要找到第一个 \(\pm 1\) 的位置即可,二分即可,此时前缀的 \(0\) 自然都确定了。
然后暴力确定后缀即可,操作次数 \(n+\log n\)。
G
给定一个排列 \(p\),每次可以 swap\((x,y)\),然后两个数都变为原来的相反数。
需要使得 \(p\to \{1,2,3...n\}\),给出一个方案,操作次数不超过 \(n+1\)
\(n\le 2\cdot 10^5\)
Solution
令 \(i\to p_i\),得到若干个环。
对于两个大小分别为 \(a,b\) 的环,我们可以花费 \((a+b)\) 次操作处理。
- 设环分别为 \(A,B\),则交换 \(A_1,B_1\)
- 交换 \((A_1,A_2),(A_2,A_3)...(A_{n-1},A_n)\)
- 交换 \((B_1,B_2),(B_2,B_3)...(B_{n-1},B_n)\)
- 交换 \(A_n,B_n\),总操作次数为 \(a+b\)
随便 swap 两个环上一个点,然后一直换即可。
只有一个环的时候操作 \(|s|+1\) 次即可:
- 大小大于等于 \(3\),则可以如下操作:
- 交换相邻两个,例如 \(1,2\)
- 然后不断交换 \(1\) 号位的数到对应位置,直到 \(|s|-1\) 处。
- 此时形如 \(-(|s|-1),-1...,|s|\),交换 \((1,|s|)\),\((1,|s|-1),(1,|s|)\) 即可。
- 总交换次数为 \(s-2+3=s+1\)
- 大小等于 \(2\),则执行如下操作:
- 此时必然存在一个 \(a\) 使得 \(a\) 处于对应位置,交换 \((1,a),(1,2),(2,a)\) 即可。
H
给定一棵树,第 \(i\) 个点的父亲为 \(a_i(a_i\in [1,i-1])\),特别的,\(a_1=0\)
支持如下两种操作:
- 对于区间 \([l,r]\),令 \(a_i\leftarrow \max(a_i-x,1)\)
- 查询 \(u,v\) 的 LCA
\(n,q\le 10^5\)
Solution
仿照弹飞绵羊,我们分块,并对于每个点维护 \(pre_i\) 表示其跳出块后到达的节点。
假定维护好了 \(pre\) 数组,那么每次查询只需要 \(\sqrt n\) 次查询 \(pre\) 数组和 \(a\) 数组即可。
不难观察到:设 \(a_i\le L\),则我们不维护其 \(pre_i\)(此时 \(pre_i=a_i\))否则我们暴力修改他们的 \(pre\) 数组。
显然总修改 \(pre_i\) 的次数为 \(\mathcal O(n\sqrt{n})\) 次。此时会发现为了进行修改(以及支持查询)我们会查询 \(n\sqrt{n}\) 次 \(a_i\) 的权值,然而对其的修改仅有 \(n\) 次,我们通过分块来均摊复杂度即可,总体复杂度 \(\mathcal O(n\sqrt{n})\)
边角需要暴力重构,唯一的细节。
特别注意:\(10^5\times 10^5>\rm int\)!
I
不会!