XDU2021新生赛网络赛补题


A.位运算

很简单签到题,直接按规则运算后二进制拆分即可。


B.1931

超长题面瑟瑟发抖

假设使用优惠券的套餐个数为 $t$ 。

那么使用优惠券的套餐总需要的价格为 $tv-\sum a_i=(t-1)v$ ,于是总价格即为 $(t-1)v+2(m-t)v=(2m-t-1)v$ 。

从该式不难看出, $t$ 越大,总价格越少。

于是考虑尽可能分散地使用优惠券。

当 $n\ge m$ 时,优惠券的数量大于等于购买套餐的数量,所以 $t$ 最大为 $m$ ,于是答案即为 $(m-1)v$ 。

当 $n< m$ 时,优惠券的数量小于购买套餐的数量,所以 $t$ 最大为 $n$ ,于是答案即为 $(2m-n-1)v$ 。

需要注意的是有一个坑点, $m$ 可以为 $0$ ,于是特判当 $m$ 为 $0$ 时直接输出 $0$ 即可。


C.等级展示

考虑 $n$ 的二进制,最多不超过八位。

从末位开始两位两位地放在一起,依次的转成的十进制数即为 *(OW 的个数(其实就是二进制转四进制)。


D.边权之和

每两个点都需要考虑,所以考虑去绝对值一起统计。

将点权从小到大排序后,记前缀和为 $s$ ,答案即为 $\sum\limits_{i=1}^n(i-1)a_i-s_{i-1}$ 。

时间复杂度 $O(n\log n)$ 。


E.tsy的轻音梦

一道比较容易的构造题。

首先很容易想到,如果 $n$ 为偶数的话,那么直接顺着填就行。

难点就在于 $n$ 为奇数的情况。

根据 $x\equiv y\pmod 2$ ,所以根据奇偶性来分析。

当 $n$ 为奇数时,偶数的总个数小于奇数的总个数,所以考虑先填偶数。

我这里的构造方案是将所有偶数摆放在方格的右上角,那么这一片里面的都是符合条件的。

为了使最外层也符合条件,只需要将与最外层的偶数相邻的奇数填在其空余的相邻位置即可。

剩余位置随意填剩下的奇数即可。

例如当 $n=3$ 时可以这样构造

1 2 4
5 6 8
3 7 9

F.奇怪的排序

动手模拟一遍。

发现了,对于第一层循环的 $i$ ,前 $i-1$ 个数一定是有序的,那么当前的 $i$ 对答案的贡献即为 $a_1\sim a_{i-1}$ 内比 $a_i$ 大的数的个数,即 $i$ 之前的包含 $a_i$ 的逆序对的个数。

同时可以发现,第一层循环为 $i$ 时,$a_{i+1}\sim a_n$ 是不动的,所以该部分对求上述的逆序对没有影响。

所以我们暴力进行 $i$ 等于 $1$ 的排序后,直接顺次来求逆序对即可。

由于值域过大,所以可以考虑离散化+线段树或者动态开点线段树。

我写的动态开点线段树,时间复杂度 $O(n\log L)$ , $L$ 为值域。


G.更高更妙的字符游戏

对于获胜条件“存在两个相邻的字符”,这个条件的触发只能在一开始,若不然,根据“最优地”进行游戏,双方在该条件即将触发导致自身失败时一定为对该字符进行操作,从而避免自身失败。

有了这个结论后,这题就很好做了。

首先判断 freesin 是否一开始就输了,或者 freesin 操作一次触发相邻字符获得胜利。

若没有上述两种情况,那么直接根据 $n$ 的奇偶来判断胜负即可。


H.内存占用计算

模拟题。

发现 signedunsigned 是没啥用的。

有用的只有数据的类型和元素的大小。

数据类型可以用 stringfind 函数来判断,但是使用时由于可能存在这样的变量名 char int114514; ,所以需要在查找的类型名后面加一个空格,这样便可以有效避免这种问题。

元素的大小,没有 [] 的话那么就是 $1$ ,有的话,将每个 [] 内的数提出来乘在一起即可。

过程中需要判断是否会爆 long long ,可以强制转 double 后取对数来判断,若爆了 long long 则直接输出 too large ,不再进行后续操作。


I.tsy的排列

容易发现这样一个四元组是由两个顺序对 $(p_a,p_b)$ 与 $(p_c,p_d)$ 和一个逆序对 $(p_b,p_c)$ 构成的。

记录 $Fmin_i$ 表示在 $p_i$ 前面且比 $p_i$ 小的数的个数(即以 $p_i$ 为后的顺序对的个数), $Bmax_i$ 表示在 $p_i$ 后面且比 $p_i$大的数的个数(即以 $p_i$ 为前的顺序对的个数)。

那么对于一个逆序对 $(p_b,p_c)$ ,其贡献的方案数为 $Fmin_b\times Bmax_c$ 。

那么对于 $p_i$ ,其作为 $c$ 时贡献的方案数即为 $Bmax_c\times \sum\limits_{b}Fmin_b$ 。

于是想到在用线段树求逆序对的过程中,令 $Fmin$ 为权值,这样就可以依次统计每个 $p_i$ 作为 $p_c$ 时的方案数。

至于 $Fmin$ 与 $Bmax$ ,同样也可以先用线段树求出来。

据此,只需要用维护两个权值线段树即可(一个权值为 $1$ ,一个权值为 $Fmin$ )。

时间复杂度 $O(n\log n)$ 。


J.璀璨星空

直接贴 PPT 吧…没啥思路


K.复杂度理论初步


文章作者: HoshiuZ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HoshiuZ !
  目录