NOI.ac 20181021 NOIP热身赛 题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ike940067893/article/details/83380562

T1 ball

可以发现每次推动球时,是将每个球的位置 1 -1 ,然后把最左边的球放到 P 1 P-1 处。

记个 1 -1 次数,再用set维护就好了。

T2 sequence

f ( i , a , b , c ) f(i, a, b, c) 表示考虑前 i i 个,换进了 a a 个,换出了 b b 个,当前的位置是 c ( 0 / 1 / 2 ) c(0/1/2) 的答案。其中 0 0 是在选择的区间之前, 1 1 是在选择的区间之中, 2 2 是之后。每次 O ( 1 ) O(1) 讨论一下当前位置的数的情况。

T3 color

方法一

考虑一个叶子节点到根的路径上的点的颜色,那么一定是前面一段的颜色与叶子节点的颜色相同,然后剩下一段的颜色均为灰色。那么每次修改就先减去原来路径上的颜色然后再加上修改后路径上的颜色,每个颜色的个数可以直接二分求出两种颜色的相交处即可。

一个节点为黑色或白色当且仅当以它为根的子树中的所有叶子节点颜色相同。那么可以求出一个DFS序,然后直接用线段树来维护,叶子节点颜色。

总复杂度: O ( n l o g n 2 ) O(n*logn^2)

方法二

求两种颜色的相交处,可以是求最近的一个灰色的节点,那么一定是这个叶子节点与另一种颜色节点的深度最深的LCA。这个必然是和它在DFS序最相近的两个点,可以用set维护每种颜色的叶子节点的DFS序值,直接查询然后倍增求LCA即可。

总复杂度: O ( n l o g n ) O(n*logn)

方法三、四(水过)

1.缩链,把只有一个son的father缩成一个点暴力处理,水过
2.直接暴力,每次向上跑,修改颜色&答案,如果修改过后的颜色与原来颜色一样就停止
PS:很水(miao)的数据,卡大暴力去了

猜你喜欢

转载自blog.csdn.net/Ike940067893/article/details/83380562