[置顶] BestCoder

BestCoder Round #65 

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太难了,再说把







虽然我很弱,但是我很努力!









你可能感兴趣的:(ACM)