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)。
\)

浙公网安备 33010602011771号