zoukankan      html  css  js  c++  java
  • 第二届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解&比赛回顾

    前言

    很幸运地拿到了 rank 1!感谢主办方老板(

    这次 rank 1 就是实力碾压了,队友负责写牛逼题我负责写傻逼题。

    比赛回顾

    咕咕咕

    题解

    题解会尽量照顾到所有水平的选手,会很通俗易懂

    这次有些题是队友写的,于是我给的题解不一定描述的很清楚,这里给出甩锅名单,看不懂请找做这个题的人。

    ACEFG by me
    DHI by shygo_cmll01
    BJK by pigstd

    如果我没更新记得私信/QQ催我!

    Overall

    题目编号 A B C D E F G H I J K
    思维难度 8 1 2 0 2 0 3 3 4 0 6
    实现难度 8 2 3 2 1 0 2 3 4 0 8

    所有难度均从 (0)(10) 打分。

    Problem A 分组

    重题 Codeforces 755G。

    值得一提的是这里开大数据范围卡掉了倍增 FFT 的垃圾做法。

    代码

    Problem B 二进制

    题面 你需要维护 $k$ 棵线段树,支持其中一个子集的区间加和查询一个子集的区间和之和。

    (n,qleq 10^5)(k=10)

    题解 根据题意暴力对每棵线段树操作即可。

    时间复杂度 (O(k(n+q)log n))

    代码

    Problem C 不正方形

    题面 给 $n$ 个红点,$m$ 个蓝点,问是否存在一个凸四边形使得相对顶点颜色相同。

    (n,mleq 250,x_i,y_ileq 10^7)

    题解 问题等价于是否存在一条红点之间的线和蓝点之间的线相交。

    暴力判断的时间复杂度为 (O(n^2m^2)),不能通过。

    考虑如果某条红点组成的线和蓝点组成的线有交,显然红点组成的线和蓝点组成的凸包有交。

    而如果红点组成的线和蓝点组成的凸包有交,显然红点组成的线和蓝点组成的线也一定有交。

    直接每条线和凸包求交即可。

    时间复杂度为 (O(n^2m)),可以通过一些技巧优化。

    代码

    Problem D 分配颜色

    题面 有 $n$ 行 $m$ 列矩阵,$p$ 次将任意行取反,$q$ 次将任意列取反,问最后共 $t$ 个元素被取反的方案数量有多少,对一个非质数取模。
    题解 考虑通过 dp 算出用 $i$ 个操作将 $j$ 行/列取反的方案数,最后枚举取反的行数和列数即可。

    时间复杂度 (O(np+mq+nm))

    代码

    Problem E 土地规划

    题面 有一个二维平面,第 $1$ 时刻 $(0,0)$ 会变成红色。

    对于之后的每个偶数时刻,如果存在 ((x-2,y))((x-1,y-1)) 一个染红色,一个没有染色,((x,y)) 就会被染成蓝色。

    对于之后的每个奇数时刻,如果存在 ((x-2,y))((x-1,y-1)) 一个染蓝色,一个没有染色,((x,y)) 就会被染成红色。

    (T) 个时刻后某个矩形中的所有点的颜色。

    (T,x,yleq 10^{12}),矩阵边长 (d) 不超过 (50)

    题解 首先观察到性质:第 $i$ 次染上的点的 $x,y$ 坐标之和一定是 $2i$,证明可以使用归纳法。

    因此,染色的过程就是向右上一层一层撒点的过程。

    注意到两个中恰好一个的条件可以看作奇偶性,于是我们直接转化条件为 ((x,y)) 的权值等于 ((x-2,y))((x-1,y-1)) 的权值和,求每个位置的权值和奇偶性。

    不难发现这样就是一个杨辉三角,即求组合数奇偶性了,我们可以使用卢卡斯定理或者一个经典结论完成。

    时间复杂度 (d^2)(d^2log(x+y))

    代码

    Problem F CTF

    题面 你在前 $2^1$ 天会每天写 $1$ 题,接下来 $2^2$ 天每天写 $2$ 题,接下来 $2^3$ 天每天写 $3$ 题,以此类推,问你前 $n$ 天会写多少题。

    (nleq 10^7)

    题解 考虑直接暴力枚举每天写 $i$ 题的日子为 $[l_i,r_i]$,和 $[1,n]$ 取交集加入答案,当 $l_i>n$ 时直接跳出即可。

    时间复杂度 (O(log n))

    代码

    Problem G 希望

    题面 有两棵 $n$ 个点的树,编号都为 $1sim n$,随机一个排列 $p$,将 $i$ 与 $p_i$ 连边,求长度为 $m$ 的简单环的数量的期望,保留四位小数。

    (nleq 300)(3leq mleq 7)

    题解 显然环一定形如从 $x$ 走树边到 $y$,走 $i o p_i$ 的边到 $p_y$,走树边到 $p_x$,走 $p_i o i$ 的边回到 $x$,因为每个环出现的概率都是 $frac{2}{n(n-1)}$,于是数环的数量即可。

    于是直接枚举四个点就可以算这个环是否合法了,预处理两点之间距离后时间复杂度为 (O(n^4)),不能通过。

    事实上两步枚举可以分开,预处理两棵树上距离为 (d) 的路径的数量即可。

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

    代码

    Problem H 只有小A受伤的世界完成了

    题面 一条直线上有 $n$ 个点,所有点对之间连边,一开始所有边从左向右连。

    (m) 次操作,每次给出一条线段,如果两个点都在线段内就反转这两个点之间的边的方向。

    问所有操作结束后存在几个有向三元环。

    (n,mleq 10^5)(a_ileq 10^9)

    题解 对于三个点 $(x,y,z)$,它们不能形成三元环当且仅当某两个点向第三个点连边的方向相等 。

    所以枚举 (x),求出 (y,z)(x) 连边方向相同的点对数量即可,这个问题可以使用线段树加扫描线维护。

    时间复杂度 (O(mlog n))

    代码

    Problem I 排队队

    题面 有 $n$ 个人,每个人有属性 $a_i,p_i,q_i$。

    (n) 个人排队,如果一个人前面的人和他的 (a_i) 一样就有 (p_i) 的贡献,不然就有 (q_i) 的贡献,问所有人的贡献之和的最大值。

    (n,a_ileq 5 imes 10^5)(p_i,q_ileq 2000)

    题解 先考虑每个人和前面的 $a_i$ 都一样,这样显然是 $sum p_i$ 的贡献。

    然后考虑将若干个 (p_i<q_i) 的人进行调整,使他们的 (a_i) 和前面的人相同并更新贡献。

    (a_i=x)(i) 的数量超过 (frac{n}{2}) 时,需要一些技巧来处理细节。

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

    代码

    Problem J 抽奖

    题面 你有 $x$ 个原石和 $0$ 个星辉,每 $160$ 个原石或者 $5$ 个星辉可以抽一发,每抽 $10$ 发会得到 $3$ 个星辉,问你能抽多少发。

    (xle 10^8)

    题解 先把原石全抽完,最后不断抽完星辉再根据累计抽奖数量更新星辉数量即可。

    显然你的星辉数量每次以对数级减少。

    时间复杂度 (O(log x))

    代码

    Problem K 树

    题面 给你一个有边权的树,求一个字典序最小的排列 $p$ 满足 $sum _{i=1}^ndis_{i,p_i}$ 最大,输出答案和排列。

    数据范围 (n le 10^5)

    题解 一个显然的上限是对于每条边 $(u,v,w)$,那么这条边的贡献最大是 $w imes t$,其中 $t$ 为这条边两边的点数的最小值,并且不难直接构造出一个排列满足条件,但是此题要求字典序最小。

    找出数的重心并且以其为根,定义一个数 (u) 的颜色 (c_u) 表示 (u) 的深度最小且不为根的祖先,特别的有 (c_{rt}=rt),那么显然不能有 (c_{p_i}=c_i(i e rt)),并且满足上述条件即可取到最大值(显然)。

    那么就先贪心的取数,一开始可以直接随便选,当取到一种颜色需要删掉的次数等于别的颜色需要删掉的次数(每个点要删两次)的时候就不能随便选了,必须要一一对应,否则就会出现上述矛盾的情况,删除等操作使用一些简单的数据结构和 dfs 序维护即可,细节较多。

    代码

  • 相关阅读:
    oracle 按关键字排序前几行
    oracle 查看某表的前10行
    linux 7安装部署Redis
    oracle 查看库表状态
    centos 7 启动和关闭zabbix 服务
    oracle 创建用户密码及赋予登录权限
    linux 控制root登录宿主机时间
    centos 更改用户登录宿主机时间
    oracle 查询、创建、删除 数据库用户
    Django基础四之模板系统
  • 原文地址:https://www.cnblogs.com/dead-X/p/15451955.html
Copyright © 2011-2022 走看看