zoukankan      html  css  js  c++  java
  • 联合省选2021题解

    联合省选2021题解

    Day1

    A.卡牌游戏

    一个很显然的思路是枚举最大值和最小值的位置,然后用(O(N))的时间判断一下是否合法。时间复杂度(O(N^3))

    那考虑对这个算法优化,由于(m)的限制显然满足可二分性(我们的策略一定是能不翻就不翻),因此可以考虑枚举最小值位置的同时二分答案,那么我们只需要特殊考虑一下无法通过反转满足要求的边界,找到二分的区间即可。

    复杂度(O(nlog n))

    A

    B.矩阵游戏

    考虑没有上下界限制的答案那么显然可以钦定(A)矩阵的最左边一列和最上边一行均为(0),递推计算即可。

    考虑(0leq A_{i,j}leq 10^6)的限制,注意到如果对于一行,把第(x)个数加上((-1)^x imes k)(k)为任意整数,那么新的矩阵依然合法。列同理。

    那考虑我们给每一行加上一个值(r_i),每一列加上一个值(c_i),那么我们最后的答案可以写成这个形式

    [egin{bmatrix} A_{1,1}+r_1+c_1 & A_{1,1}-r_1+c_2 &.... \A_{1,2}+r_2-c_1 & A_{2,2}-r_2-c_2 &.... \....&....&.... end{bmatrix} ]

    但我们很不喜欢看到这种加和的项,因此考虑隔行取反,这样就可以进行差分约束了。

    复杂度(O(nm))

    B

    C.图函数

    考虑另一个问题:无论(v)有没有对(u)做贡献,我们都将它删去。

    那么仔细想想这个题是和原问题等价的,因为如果这个点(v)没有和(u)强联通,那么其他点和(u)强联通的那两条路径上也必不会有(v)(否则设这个点为(x),(x)显然可以通过(v)走到(u))。

    那考虑最终答案是(sum{f(u,G)}),那么我枚举(u),只考虑编号不小于(u)的点,倒序加边,那如果一个(v)(u)强联通了,设这条路径上编号最小的边编号为(x),那么点对((u,v))可以对(h(G)....h(G_{x-1}))做贡献。于是差分一下,最后统计一下后缀和即可。

    C

    Day2

    D.宝石

    显然可以(O(nmlog n))用倍增解决。

    但上述做法是没有前途的。

    考虑(mleq300)

    首先可以发现我们要把(s o t)的路径拆成(S o LCA)(LCA o T)

    由于(P_i)互不相同,那么我们可以处理出每个点(i),设(f(i,gem))表示(i)向上的第一个宝石为(gem)的节点,那我们可以(O(nm))处理出(f)的值,对于(S o LCA)的路径暴跳即可,对于(LCA o T)的路径我们反着暴跳即可。

    现在(mleq 5 imes10^4)

    上述做法看起来也歇了,但仔细想想是有前途的,我们可以用主席树把空间缩小,那么关键的部分就是我们不能在树上暴跳了。

    但我们发现从(i)往上找一个宝石,再从这个点往上找一个,等价于从(i)向上找两个。

    那么倍增即可处理(S o LCA)的部分。

    对于(LCA o T)的路径我们可以二分这部分收了多少宝石,然后从(T)反着找这么多宝石,看最后的那个点深度与(LCA)的关系

    时间复杂度(O(nlog^2n))

    D

    E.滚榜

    省选最大诈骗题

    因为我们不关心(b_i)的具体分配方式,因此对于一个全排列我们可以贪心地去分配。给每一个人尽量少的(b),最后看(m)个题是否够分即可。

    时间复杂度(O(n!)),期望得分(60pts)

    虽然上边的那个大暴力得分很高,但是它是没有前途的,看到这个范围其实应该还是给状压(dp)的。

    由于(b_i)单调不降,那么如果我这个点分配了一些题,那么后边所有点都要分配至少这么多题。

    那么可以考虑维护增量,提前计算贡献,设(f(S,i,j))表示已经选的人的集合为(S),上一个选的是(i),已经有的贡献是(j)的可能排名个数,枚举增量和上一个的位置转移即可。

    E

    F.支配

    支配关系显然形成一棵树,且我们可以用类似于拓扑排序的方法求出支配树。

    问题就在于如何处理询问。

    注意到一个点(u)的受支配集改变一定是存在一条路径使得他不经过(u)的祖先,进一步的我们发现他一定不经过(u)在支配树上的父亲。那么我们可以考虑处理出每一个点(u)不经过它在支配树上的父亲,能被什么点(v)到达,那么这个(v)就有可能对点(u)做贡献,那么我们处理询问的时候直接树上差分即可。

    F

  • 相关阅读:
    朴素贝叶斯分类算法原理分析与代码实现
    决策树分类算法原理分析与代码实现
    Eclipse Java 调试基本技巧
    Eclipse Java 开发平台实用技巧
    泛型算法
    集合类型的使用示例
    异常
    内部类
    对象复制
    界面设计常用CSS属性
  • 原文地址:https://www.cnblogs.com/szmssf/p/14685947.html
Copyright © 2011-2022 走看看