#1
第一轮是我出的。
比赛情况:
#1 NanoApe 300 (完美AK)
#2 && #3 swm_sxt / ccz 200
A.candy
这道题就是个nim游戏, 我们知道当且仅当选出的各堆糖果的异或和为0时,先手必败.
这样问题转化为从N个数中选1一些数使得他们的异或和为0的方案数.
30%,O(2^N) DFS.
假如只有询问, 那么可以直接用类似01背包的dp解决.
for i = 1 ~ 1024
dp(i, x) += dp(i-1, x^w_i);
dp(i, x)表示考虑了前i个糖果, 异或和为x的方案数. 时间复杂度O(1024*N)
加入操作, 直接再来1次O(1024)的dp即可.
删除操作, 暴力做的话会TLE, 但是只能暴力.
暴力做就可以拿60%.
注意到加入操作不超过10, 我们可以时光倒流, 这样加入操作变成了删除操作, 删除操作变成了假如操作, 删除时暴力重新dp就不会TLE了。
B.233
暴力, 期望得分0~60, 给出了详细的数据范围,就是想看你们的乱搞能力.
100%,莫队算法.
首先, 拆去绝对值, 用数据结构(树状数组/线段树/平衡树/暴力)维护, 那么我们可以O(log N)的时间来从[L, R]的答案算出[L-1, R]或者[L+1, R]或者[L, R-1]或者[L, R+1]的答案
假如我们当前知道了[L, R]的答案, 然后想得到[L‘, R‘]的答案, 那么代价就是O((|L-L‘|+|R-R‘|) log N)
离线, 令m=N^0.5, 将询问[l, r]按 l / m为第一关键字, r为第二关键字排序.
然后按这样的的顺序去计算, 每次都是暴力移动, 时间复杂度O(N^1.5 log N)
C.D
高斯消元求出f数组. f(u) = sigma(f(v)+w(u,v)) / degree(u), degree(u)为结点u的出度.
跑1遍tarjan, 就变成了DAG, 然后DAG求最长链就是经典问题了...dp就可线性求解.