2023杭电多校第一场
Hide-And-Seek Game
题目大意
给定一个树,m组询问,每次询问给定四个数,Serenade从开始走到,再从开始走到,如此循环往复。Rhapsody同时从开始走到,再从开始走到,如此循环往复。输出他们第一次相遇的结点,若永远不会相遇则输出
解题思路
先找出从到的路径与到路径相交的结点,分别表示Serenade和Rhapsody到这些结点的时间。
如到的路径中有一点u,则(从向方向经过该点)或(从向方向经过该点)()
同理,到的路径中有一点v,则(从向方向经过该点)或(从向方向经过该点)()
因此我们还要用预处理出到的距离和到的距离以及到的距离和到的距离
令两人在相遇,则有四种可能:
每个方程都可以转化为的形式,找到每组解的最小非负整数解或返回解不存在
我们取其中一种情况:
即:
因为要求第一次相遇,应该尽可能小,所以应该尽可能小所以取最小非负整数解。
套入扩展欧几里得模板即可:
求解更一般的方程
设,当且仅当时有解即
通解=特解+齐次解
特解:
1 | int exgcd(int a,int b,int &x,int &y);//函数同上 |
齐次解:
即的解
通解:
通解=特解+齐次解
令,则对于x的最小非负整数解为
令,则对于y的最小非负整数解为
复杂度分析
时间复杂度:O(n+m)
参考代码
1 |
|
City Upgrading
题目大意
给定一个树和树上每个结点放置路由器的成本,每个路由器可以覆盖当前结点及其相邻的节点,输出最低成本使所有结点被覆盖。
解题思路
dp状态机模型(状态转移只考虑它的节点)
每组相等情况下最多每组分到个,剩下个物品,最坏情况下每组一个,分完为止。
易得结论:当时,最多一组物品数量为;否则为。
复杂度分析
时间复杂度:O(1)
参考代码
1 | void solve(){ |
Easy problem I
题目大意
给定一个长度为n的序列,q次操作。
操作1:将l~r区间的每个数都变成ai=|ai-xj|,
操作2:询问l~r的区间和。
解题思路
用线段树维护。
修改操作中,将数列分为两块进行维护,一块是ai出现过小于xj情况的数,还有一块是一直都大于等于xj的数。
由于每次修改操作中的xj不递减,小于xj的数在接下来的操作中不会出现大于xj的情况,而原来大于等于xj的数接下来可能会小于xj,我们直接把他的相关信息修改成小的那块。
其中,当,,直接懒标记维护即可。
当,,即将取相反数加上x,叠加情况后发现如以下情况操作了j-1次时:
这里我们先规定根节点为1,然后用换根来O(1)改变结点。我们先求出每棵子树的sg值记作fs[u],因为要求以所有树为根的sg值,所以为了实现换根,我们需要再求出每个结点父亲方向上的sg值记作ff[u]。
易得:
这里要设置为-1,因为1没有父亲,根据上面解释,有一个点时sg值为0,这里用-1表示没有点。
求完后先计算1,然后换根每个点的sg值累加答案。
概率就是获胜点数/总点数
时间复杂度线性
参考代码
1 |
|