A
你有序列 \(A_i\),使得 \(A_i\) 增加 \(1\) 的代价是 \(b_i\),问使得所有 \(A\) 互不相同的最小代价。\(n\le 1e5,A_i\le 1e9\)
对于 \(A_i\) 相同的,取 \(B_i\) 最大的留下,剩下的都 \(+1\),跟后面的继续比较。
B
你要求所有边 \(or\) 起来最小的生成树,\(q\) 次询问,每次新加入一条权值为 \(0\) 的边并求最小 \(or\) 生成树。
\(n,m\le 10^5,w< 2^{30}\)。
如果只有一次询问我们怎么求最小 \(or\) 生成树呢?考虑从高到低填 0/1,判断当前边集是否联通即可。
有多次询问呢?观察到最后答案的种类数为 \(\log V\) 级别的,所以我们写一个类似整体二分的东西即可。
每个答案种类需要经过 \(\log V\) 层,复杂度 \(O(m\log ^2V)\)。
C
你要维护字符串集合,每个字符串有一个值。
支持:令 \(s=s_i[1:k]+t\) 并插入集合;将拥有某前缀的字符串的值 \(+x\);单点查值。
考虑离线,先建立字典树后变成子树加。 使用倍增维护 \(k\) 级祖先以支持操作 \(1\)。
D
你需要维护序列 \(A\),支持单点修改,求 \([l,r]\) 里面最长的子区间,满足取出区间里的数能构成凸多边形。
\(n,m\le 10^5,A_i\le 10^{13}\)
构成凸多边形的条件是最大值小于剩下的和,也就是 \(\max < \frac{1}{2}sum\)。
那么我们线段树维护区间前 \(\log V\) 大的作为最大值,再判断即可。