tg 6 7 题解

攒了不少题了

D1T1

这个题正解KMP
CDsidi说直接两个串A前B后直接跑
但是考场上把KMP忘记的同学,要学会使用Hash
如果换用Hash就是无脑题了
但是:多测不清空,爆零两行泪

D1T2

我的看法是
以下为口胡部分
先e-dcc缩点于是整张图就是一棵树了
然后从n到1往上跳,是割点就是必经点

正解求割点然后同时换方式维护信息
如果满足dfs序当前节点小于low值,标记这个点是必经点
然后再用这个点更新下low就行了

D1T3

没听懂咕

D2T1

先求所有数的\(gcd\)
然后浅求一下循环节就结束了

D2T2

坐标转化\((i, j) −> (i + j,i − j)\)
原坐标图中的曼哈顿距离\(∣i − i ∣ + ∣j − j ∣\)等于
转化坐标后的切比雪夫距离\(max{∣i − i ∣, ∣j − j ∣}\)
这样,坐标是最大值,转移也是最大值,因此可以用四个变量
分别记录\(f − i , f + i , f − j , f + j\) 即可。
时间复杂度\(O(nm)\),其实不需要转化坐标也可以直接用四个变
量直接记录转移。

D2T3

这个题是个神仙题
\(40pts\)
\(Subtask1:\)暴力分
\(Subtask3:\)维护0/1前缀和,\(ans2=0, ans1=\sum\limits^n_{i=1}\begin{cases} i-t[i],a[i]=0\\ t[i],a[i]=1 \end{cases}\)
\(t[i]\)表示\(i\)位置及以前有多少为\(1\)

正解:
\(对于每个数a ,找出它作为最大值的区间[l , r ] (单调栈可做 到O(n),set可做到O(nlogn)),所有区间只有包含和不相 交关系,没有相交关系,而且所以区间构成了一棵二叉树。 对每个区间[l , r ]维护一棵01trie树T 。 对每个区间[l , r ]维护一个数组f ,其中f 表示该区间中第j 位为1的数有多少个。 所以区间构成了一棵二叉树,可以对区间进行启发式合并,对 于a 控制的区间[l , r ],找到它的左右儿子lch : [l , x − 1] 和rch : [x + 1, r ],我们只需要考虑所有包含x的区间的答 案,而且这些区间的最大值都是a 。 若左区间的长度<右区间的长度,我们可以枚举左区间中的每 个数a 。 对于ans_1 ,我们可以分别统计每一个二进制位的答案,若 a 的第j位是0,那么第j位的贡献就是2 f ,若a 的第 j位是1,情况类似。同时,将a 更新到f 中。 对于ans_2 ,问题就转化成右区间中有多少个数v满足 v xor a > a ,可以在T 中查询。同时,将a 插入到 trie树T 中。 时间复杂度O(nlognlogv)。 \)

posted @ 2022-07-16 20:24  2K22  阅读(33)  评论(0)    收藏  举报