肝bzoj十连测

前言

有些场缺失。
已经单独写过的第二场、第三场和第五场这里就不写了。
这里写的都是没有做的,仅仅是写题解。

第六场

A

一个图,有若干点对。
两人轮流操作,每次将一个无归属的结点归给自己,所有结点均有归属游戏结束。
如果一个点对的两个点都被同一人占有,该人获得此点对对应权值。
先手希望最大化其的价值减去后手所获价值,后手则希望最小化。
每次添加或删除一个点对,你要在这之后输出先手的价值减后手价值。

设一个结点的权值为其所处所有点对价值和。
那么我们重新定义,一个人的权值是其所占有所有结点点权。
于是我们发现,如果一个点对两点均被同一人占有,会带来双倍价值,而若在不同人手里,因为是先手价值减去后手价值,刚好抵消。
因此,除以2便是正确答案。
这个新的游戏很好维护,因为双方一定是每次取最大那个。
于是我们需要维护点权按照降序排序后奇数位和减去偶数位和,并且要兹瓷修改点权。
一次修改可以看做删除与添加。
只要能知道删除位置所属奇数位还是偶数位即可,可以用线段树维护点权,通过询问比其小的个数可得知,然后维护好奇数位和与偶数位和即可。

第四场

A

长度为m的绳子上有n只蚂蚁,蚂蚁速度均为1,且有一个初始方向。两种方案不同仅当存在一只蚂蚁初始方向不同。两只蚂蚁相遇就会各自改变方向。求对于所有T,最后一只离开绳子的蚂蚁离开时间恰好为T的方案数。

相遇的掉头可以看做穿越。
于是可以枚举T也就是最大值,进行统计。
每只蚂蚁对应着两个权值即其离开绳子的两种时间,我们将总共2n个时间离散,顺序扫,对于一只蚂蚁,较小的离开时间是左端点,较大的离开时间是右端点。对于一个T,如果扫过的左端点数量小于n那么方案数一定为0,否则方案数为2^(扫过右端点数量)。

B

有n个栈与m个操作,操作类型有三种:
1、将元素x压入第l~r个栈中。
2、将第l~r个栈的栈顶元素弹出。
3、询问一个栈的第k个元素。

可以考虑离线,用线段树来维护,下标为时间,添加权值为1,删除权值为-1。扫到一个点,做掉挂在其上面的1、2操作,然后解决挂在上面的询问,相当于询问线段树一个前缀区间的一个最大位置使得该位置后缀为k。

你可能感兴趣的:(个人,杂文)