大概就是前期我和 Flukehn 双线 (基本不交流),Flukehn 切难题我签到。
后期跟 Flukehn 讨论了讨论 A,最后利用 OEIS 过了。
O 题狗都不写!
给定 (),求 使得 或报告无解。 组数据。
很裸的背包,是个人就会做。
给定一棵树,每个点有权值 。对于每个节点,求以其为根的子树中权值大于、小于、等于该点权值的点的个数。
直接一边 DFS 一边启发式合并 pbds 中的名次树就行了。这题和 qko 的爱情本质上是一样的,所以也可以写一个 的做法,但是当时懒得思考了。
启发式合并的时候要注意交换 pbds 容器时写 swap(a, b)
会挂掉 (这样交换是 的),必须写 a.swap(b)
才能 。这和标准库中的 std::set
等是不同的。这是因为 pbds 既没有提供自定义的 move constructor,也没有提供自定义的 swap
重载函数。
签到题,是个人都会。
给一个无向图 ,判断其是否满足其中每个简单环的边权异或和都是 。
我们可以列出 个相互独立的回路方程,判断它们是否成立即可。
因为异或是线性运算,所以只要这些独立方程都成立,那么所有回路方程都一定成立 (2020 熊猫杯 F)。
字符串处理题,看样例识题意:
3
https://www.notexist.com:12345/b/c.d/e
http://121.48.165.90
http://1.2.3.4:5/6.jpg
http://www-notexist-com-12345-p-s.vpn.uestc.edu.cn:8118/b/c.d/e
http://121-48-165-90.vpn.uestc.edu.cn:8118
http://1-2-3-4-5-p.vpn.uestc.edu.cn:8118/6.jpg
这种题用 Python 写可以很短,直接贴代码:
t = int(input())
for _cs in range(1, t + 1):
url = input()
parts = url[url.find('//') + 2:].split('/')
parts[0] = parts[0].replace('.', '-')
if parts[0].find(':') != -1:
parts[0] = parts[0].replace(':', '-') + '-p'
if url[4] == 's':
parts[0] += '-s'
parts[0] += '.vpn.uestc.edu.cn:8118'
print('http://' + '/'.join(parts))
这题太繁了,稍后再写。
给定一个操作序列 ,区间修改操作 将 s[l..r]
中的 类型操作的移动距离增加 ,区间查询操作 表示取出 s[l..r]
,将其周期延拓成无限的串 p
,然后进行 p[l..(l+t)]
中的操作,求移动产生的效果。
就是很裸的线段树…… 只要理解“线段树是维护半群上的区间乘积”就会写了。然后求一下 s[l..r]
的效果和 s[l..(l + t % (r - l))]
的效果就行了。
构造矩阵 ,要求矩阵中元素不重复,相邻 (上下左右) 元素的二进制表示恰好有一位不同,并最小化矩阵中的最大元素。只需要输出最大元素。
这题一开始很没思路,于是暴力打 的情况,发现序列是 (后面打不出来了)。因为是线上赛,直接到 OEIS 一搜,找到这个序列是 A330940。对该数列的描述是 “ 为将 的二进制表示看作一叠扑克牌,然后将两叠这样的扑克牌洗牌后能得到的最小二进制序列”。自然想到对于本题,可以把这个东西推广成将 的二进制表示 (高位在前) 和 的二进制表示 都看成一叠扑克牌,然后进行洗牌操作后能得到的最小二进制序列。我们用 表示 x[..i]
和 y[..j]
洗牌能得到的最优解,就能 地 DP 了。
注意直接贪心 (归并两序列) 是不对的。
然后就过了,后来想了一下这个东西相当于选出 个二进制位在横向构造格雷码, 个二进制位在纵向构造格雷码,然后安排这些二进制位使得矩阵中的最大值最小的方案。这个东西可行性是显然的,但是最优性我还是不会证。
剩下题全是 Flukehn 写的,Flukehn 太强了 Orz。
我可能补一下 H,学习一下多项式。