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.内存占用计算
模拟题。
发现 signed
与 unsigned
是没啥用的。
有用的只有数据的类型和元素的大小。
数据类型可以用 string
的 find
函数来判断,但是使用时由于可能存在这样的变量名 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 吧…没啥思路