A. Game with Cards
题目解析
直接判断Alice的最大卡片和Bob的最大的卡片的大小,如果相等,先手获胜,否则较大的获胜。
参考代码
B. Card Trick
题目解析
移动前 bj 张牌到末尾,意味着将牌顶指针向下移动 bj 。如果牌顶指针移到牌底之下,就将牌顶指针移回牌顶。
参考代码
C. Double Sort
题目解析
先将 ai,bi 合并起来排序,然后检查 bi 是不是非递减的。
如果不是非递增的,那么就不存在结果;
如果是非递增的,那么就可以通过交换,使它满足均非递减的状态;
然后根据初始位置和当前位置,设定一下交换关系。
参考代码
D. Required Length
题目解析
从 x 开始,遍历它的每一位,然后找到它可以转移到的,大于 x 的下个数字。通过BFS找到是否能转移到一个n位的数字。
开unsigned long long
比较保险。
参考代码
E. Labyrinth Adventures
题目解析
首先设定起始点 (sx,sy) 的层序 Ls 小于或者等于目标点 (ex,ey) 的层序 Le ,如果不满足,就交换起始点和目标点。
如果起始点的层序和目标点的层序相同,起始点和目标点的曼哈顿距离就是结果,因为可以沿着当前层运动。
如果起始点层序小于目标点的层序。我们可以用线段树维护一下起始层的门旁位置到目标层的前一层门旁位置之间的最短距离(分别是 duu,dur,dru,drr)。门旁位置是代表当前位置的上方或者右方有一扇门。 然后计算起始点到起始层门旁位置的曼哈顿距离(分别是 dsu,dsr )和目标层的前一层的门旁位置到目标点的曼哈顿距离(分别是 due,dre )。
那么起始点到目标点的最近距离就是:
dse=min(dsu+duu+due,dsu+dur+dre,dsr+dru+due,dsr+drr+dre)
我们定义的线段树的节点如下所示:
参考代码
F. Unique Occurrences
题目解析
首先将题意转化为求每条边对结果的贡献。对于边 (u,v,c) 来讲,他的贡献就是在 u←v 方向的 u 的子树中到 u 的路径不包含边权为 c 的节点总数 与 在 u→v 方向的 v 的子树中到 v 的路径不包含边权为 c 的节点总数 的乘积。
以 1 为根,遍历整棵树,找到每个节点的子树的节点总数 cnt。同时构建倍增数组 fa ,倍增数组用来寻找祖先节点。
第二次遍历以 1 为根的整棵树的时候,当前节点是 curp,子节点是 nexp,边权是 c(curp,nexp),判断可以判断之前遍历过的,具有相同边权 c(curp,nexp) 的边所相连的两个点 (curi,nexi) 是否在当前子树之下, nexi 是 curi 的相邻子节点。这里可以用倍增来判断是否是在相同子树上 isSameTree。
Sdowni 是从 curi→nexi 方向的 nexi 的子树中到 nexi 的路径不包含边权为 c(curi,nexi) 的节点总数。
Supi 是从 curi←nexi 方向的 curi 的子树中到 curi 的路径不包含边权为 c(curi,nexi) 的节点总数。
那么当前边 (curp,nexp) 的 curp→nexp 方向的 nexp 的子树中到 nexp 的路径不包含边权为 c(curp,nexp) 的节点总数是
Sdownp=cntnex−i=1&isSameTree(nexp,nexi)∑cntnexi
同时可以得到 curi←righti 方向的 curi 的子树中到 curi 的路径不包含边权为 c(curp,nexp) 的节点总数是
Supi=Sdownp(isSameTree(nexp,nexi))
参考代码