CF1491

C

好坑啊。

访问到 \(i\) 之后多余的传给 \(i+1\)

对于 \(2\sim i+a_i\) 直接 \(+1\)

清空数组需要清空到 \(n+1\)

D

按照二进制位排序序即可。

需要判断一下是否 \(u<v\)


E

定义一棵树是好的当且仅当其大小为 fib 数列,且以下两个条件满足至少一个:

  1. 大小为 \(1\)
  2. 可以割去一条边变成两棵 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\) 次即可:

  1. 大小大于等于 \(3\),则可以如下操作:
  • 交换相邻两个,例如 \(1,2\)
  • 然后不断交换 \(1\) 号位的数到对应位置,直到 \(|s|-1\) 处。
  • 此时形如 \(-(|s|-1),-1...,|s|\),交换 \((1,|s|)\)\((1,|s|-1),(1,|s|)\) 即可。
  • 总交换次数为 \(s-2+3=s+1\)
  1. 大小等于 \(2\),则执行如下操作:
  • 此时必然存在一个 \(a\) 使得 \(a\) 处于对应位置,交换 \((1,a),(1,2),(2,a)\) 即可。

H

给定一棵树,第 \(i\) 个点的父亲为 \(a_i(a_i\in [1,i-1])\),特别的,\(a_1=0\)

支持如下两种操作:

  1. 对于区间 \([l,r]\),令 \(a_i\leftarrow \max(a_i-x,1)\)
  2. 查询 \(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

不会!

posted @ 2021-03-03 15:39  Soulist  阅读(108)  评论(0编辑  收藏  举报