B 题意:ZYB在远足中,和同学们玩了一个“数字炸弹”游戏:由主持人心里想一个在[1,N][1,N]中的数字XX,然后玩家们轮流猜一个数字,如果一个玩家恰好猜中XX则算负,否则主持人将告诉全场的人当前的数和XX比是偏大还是偏小,然后猜测的范围就会相应减小,一开始的范围是[1,N][1,N].每个玩家只能在合法的范围中猜测. 现在假设只有两个人在玩这个游戏,并且两个人都已经知道了最后的XX,若两个人都采取最优策略.求X \in [1,N]X∈[1,N]中是后手胜利的XX数量.
思路: 当n为奇数时,比如5: 1 2 3 4 5 。发现只有当X==3时 先手必输(后手始终可以跟着先手关于3的对称点选) 那么X==2(先手猜4,后手只能猜1 || 3 都是输) || 4(雷同) || 1(先手直接猜2 后手输) || 5(雷同)
那么当n为偶数时,比如 4: 1 2 3 4 。当前 X== 1 || 4 时 先手赢,当X==2时 ,先手猜4那么又变成奇数的情况了 所以一直都是先手赢
代码略......
C 题意: ZYB有一个排列P,但他只记得P中每个前缀区间的逆序对数,现在他要求你还原这个排列.
(i,j)(i < j)(i,j)(i<j)被称为一对逆序对当且仅当Ai>Aj
给定的ai是前缀区间[1,i]里面的逆序对数 直接说一组样例
下标 1 2 3 4 5 6
ai 0 1 1 4 8 10
全排列 5 3 6 2 1 4
很容易发现,ai从后往前,可以知道当前这个数在[1,i]区间有几个数比它大==a[i]-a[i-1];
10-8=2;当前[1,6]区间有2个数比它大,那么anw[6]=4;
8-4=4 ;当前[1,5]区间有四个数(6,5,3,2)比它大,4已经选了,那么anw[5]=1;
4-1=3;当前[1,4]区间有三个数(6,5,3)比它大,1,4已经选了,anw[4]=2;
1-1=0;当前[1,3]区间有0个数比它大,1,2,4已经选了,anw[3]=6;
1-0=1;当前[1,2]区间有1个数比它大,1,2,4,6已经选了,anw[2]=3;
1-0=0; 当前[1,1]区间有0个数比它大,1,2,3,4,6已经选了,anw[1]=5。
也就是用线段树或者树状数组维护第k小。k=i-(a[i]-a[i-1]);
#include #include #include #include #include #include #include #include #include #include
D题意:ZYB有一颗N个节点的树,现在他希望你对于每一个点,求出离每个点距离不超过K的点的个数.
两个点(x,y)在树上的距离定义为两个点树上最短路径经过的边数,输出N个点的答案的xor和。
思路:第一遍DFS找当前节点向下走的长度<=k的num。第二遍DFS找当前节点向上走的长度<=k的num。
第一遍的时候直接搜就可以了,第二遍分两次取anw,令前节点为v,当前节点的父亲为x,仔细想一下,要寻找当前节点向上的num,是不是可以分成
1.找v的兄弟的num也就是父亲x的子节点 2.找父亲x的祖先 到x长度<=k-1的num
#include #include #include #include #include #include #include #include #include #include