bzoj 3729

题意:
在一棵树上博弈,每次能将不超L个的石头移到父亲。
支持三种操作:
1.询问u为子树的博弈情况
2.修改某个点的值权
3.插入一个新点

题解:
博弈部分
如果直接将u为第0层,就是奇数层的数值才是有用的。
因为不超过L个,后手可以保证每次两人取得(L+1),所以sg值为模(L+1)。
那每次询问就是对整棵树奇偶分层,和当前点奇偶性不同的sg值XOR和。

用splay维护dfs序,每个点拆成两个。
在spaly上用两个点可以包住所有子树内的点。
每个节点分别维护子树内奇数层和偶数层的sg值XOR和。
可以规定:右端点没有权,权在左端点上。

代码:
http://paste.ubuntu.com/24233614/

小结:
这连串数据结构题,是liaoliao给的题目中个人感觉很有启发性的。
在做的过程中,暴露一些问题:
没想清楚就开打。。。这。。。
个人性格决定一定要想请每个细节才打。
打到一半发现忽略的细节一定放下重新想。
少浪费时间想打指针还是数组,无聊。。。
打代码不能急躁,按着节奏来。
不要乱对拍调试,先冷静看看代码。

可以过去一段每日10k+的日子了?(笑)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值