A.
模拟水题
B
这题是个博弈,必须构造出必胜态,假设里面随便一个数是是X,然后先手为了必胜要构造必胜态,就肯定是把X两边的数字取平,这样后手破坏平衡,先手取平,最后肯定是后手取到X,所以n奇数的时候只有在中间是后手必胜,n偶数的时候都是先手必胜
感觉我还是要多看博弈题,博弈渣
C
逆序对的题,一般都是线段树或者是树状数组
这题用树状数组可能会T,因为树状数组需要二分
线段树的话按照值域插值,然后开头每个位置都初始化为1,说明有1个空位
然后从序列后面往前考虑,a[i]-a[i-1]就是i位置的数字和前面的数字组成多少个逆序对
an=x的话,说明有x个比an大的数字在an前面,maxv[1]表示这会线段树里还有多少个空位,然后有x个比他大,说明它是maxv[1]-x个,query一下,就知道是几了,然后update
思路还是有点混乱,这题过太慢了
AC代码:http://paste.ubuntu.net/13883094/
D
给你一棵有向的树,然后有权值,问你到每个节点,距离小于等于k的点的个数,然后这些全部异或起来的结果
显然是树形dp啦,就是怎么更新的问题
dp[u][k]表示到u节点距离为k的节点有多少个
首先考虑u为子树的根的情况,那必然是搜一下,搜完之后类似背包的更新,初始化dp[u][0]=1,其他为0
然后要考虑从上面来的和u距离k以内的节点个数,一开始想不出这个怎么更新,后来发现是二了
这会到父节点距离k以内的节点都是来自u和另外的子树,那么可以从上往下更新,到u距离为k的,就说明到fa节点距离k-1,但是不是从u这个节点过来的
dp[u][k]+=dp[fa][k-1]-dp[u][k-2];
dp[u][1]+=d[fa][0];
这样就先更新父亲,再往下搜,就OK了
AC代码:http://paste.ubuntu.net/13883291/
E太难了,再说把
虽然我很弱,但是我很努力!