闲话 22.9.23
闲话
预告一下
继FFT FWT FMT后又出现了FDT(F的T)
\(\text{Z}\color{red}{\text{hou}}\) 喜欢在有着秋日气氛的校园里面散步
\(\huge Cdsidi\)喜欢吃七分饱而且巨所以\(_水\)管子炸了
不知道说什么东西
不知道我在说什么?你很快就会知道的
昨天jjdw的歌词是LostOne的号哭
想唱但是脑子里只有mafu的不知道是什么的歌 似乎是《空腹》
今天jjdw的(没有)歌词是Merry Bad End
是mafu的歌但是没歌词所以一句都想不出来
但是《空腹》很会唱(
虽然唱不上去就是了
今天是饭的图!
旅 - 其四
比较大所以这个是小一点(一半)的
点我!
因为被AT题干掉了
于是在找构造题练手
在洛咕上搜构造标签
于是给了我一道题
P4689 [Ynoi2016] 这是我自己的发明
啊对对对
几天来随便切了几道题
因为jjdw写了所以我写一下
其实没什么难的题 要么一眼出性质要么两眼出结果
所以意识流一下 看不懂见谅
没有代码。
[YER 2021] TEST_68
给定一棵 \(n\) 个节点的树,第 \(i\) 个点有一个权值 \(a_i\)。
对每个点 \(x\),其的答案为其所在子树外的所有点中,选两个可以相同的点 \(i,j\),\(a_i\) 异或 \(a_j\) 的最大值,如果选不出两个点,则认为 \(x\) 的答案是 \(0\)。
\(1\le n\le 5 \times 10^5\),\(0\le a_i \le 10^{18}\)。
第一眼Trie。考虑怎么维护求值。
这题唯一的性质就是“子树外”三个字。从这上面下手。
叶子节点显然除了自己都能选。然后外推性质发现最终似乎有很多点的答案都是相同的。
设树上任意两点的 xor 最大值出现在 \(a[p] \oplus a[q]\)。根据性质似乎有 \(p\) 与 \(q\) 到根的路径上外的所有点答案都是 \(a[p] \oplus a[q]\) 。这样问题就被解决大半了。这部分答案可以直接上Trie板子。
然后考虑怎么求出 \(p\) 与 \(q\) 到根的路径上点的答案。两边的路径除了LCA外是不相关的,可以求两次。因此在特判LCA的情况下可以拆成两条链求解。
对于一条根到目标节点的链,我们从根开始往下扫,扫到一个节点先把不含目标节点的子树中的值加入Trie,这棵Trie里的 xor 最大值就是这个点的答案。然后把这个点加入 Trie,接着扫。
总时间复杂度是三次插入+查询每个节点。因此是 \(O(n \log {值域})\) 的。
简单题
\(T\) 组询问。一开始给定一个常数 \(K\)。每次询问单独给定 \(n\)。请你求出:
\[\sum_{i=1}^{n}\sum_{j=1}^{n} (i+j)^K \gcd(i,j) \mu^2(\gcd(i,j)) \pmod {2^{32}} \]\(T = 10^4\), n\le 10^7,\(1 \leq K < 2^{31}\)。
化式子题。也不太难,是不同于幽灵乐团的做法。
令 \(S(n) = \sum_{i=1}^{n}\sum_{j=1}^{n} (i+j)^K\),\(G(n) = \sum_{i=1}^{n} i^K\),\(f(T) = \sum_{d|T} \mu^2(d) d \mu(\frac Td)\)
则原式变为
这个一眼整除分块。然后考虑预处理 \(f\) 的前缀和以及快速处理 \(S\) 的单点。
证明考虑竖着求和变横着求和。然后自然数幂是完全积性的 \(id_K\),可以直接筛,这样我们就解决完两个东西了,剩一个 \(f\)。
简单推一下 \(f\) 的筛法。\(f\) 在质数处的取值显然 \(p - 1\),接下来是筛的部分。
筛就完了。然后没了。
[NOIP2015] 充满了希望
给一个长为 \(n\) 的序列,有 \(m\) 个操作,操作编号从 \(1\) 到 \(m\),每个操作为:
1 x y
:将序列位置为 \(x,y\) 的两个元素交换。
2 l r x
:将序列区间 \([l,r]\) 内所有元素修改为 \(x\)。
3 x
:查询序列 \(x\) 位置的值。现在有 \(q\) 次查询,每次查询给出一个操作的区间 \([l,r]\):
先将序列中的元素全部置为 \(0\),之后依次进行从 \(l\) 到 \(r\) 的所有操作,求出所有这些操作中所有 \(3\) 操作的答案的和。
查询之间独立。
\(1\le n,m,q\le 10^6\),\(1\le x\le 10^9\)。
一眼被吓到。第二眼发现这玩意是求和。然后就好搞了。
容易发现所有查询查出来的要么是2操作改的值,要么是0。
考虑先预处理出每次操作的值。
我们整来一棵线段树,叶子维护元素最新一次修改对应的修改操作编号,然后顺序扫每个操作。如果是1就把树上x和y叶子节点的编号swap,2就区间覆盖这个操作,3就把当前x的编号记录下来。
对于查询,我们离线下来做扫描线,过程中用BIT维护当前操作集合
经典地,在r位置记录一个l,然后顺序扫每个操作。对于3操作,把BIT里记录的编号位置加一个编号对应操作的x值,其他操作不管。操作完扫当前位置的查询,查一下BIT里l-r区间内的和就是最终答案。
看上去很离谱但是比较套路。
异或粽子
给定一个长度为 \(n\) 的数组 \(a_i\) ,你每次可以选择一个区间 \([l,r]\) ,其价值为 \(val[l,r]=\bigoplus_{i=l}^r a_i\)。求价值最大的 \(k\) 个不同区间的价值和。
\(1\le n\le 5\times 10^5,1\le k\le \min\{\frac {n(n-1)} 2 ,2\times 10^5 \},0\le a_i\le 2^{32}-1\)
比较套路?这题应该也比较经典了。
上来求一个 xor 前缀和 \(s_i = \bigoplus_{i=1}^r a_i\),然后问题转化成从 \(s_{0\dots n}\) 里选出 \(k\) 对来 xor 的最大值。
不想去重,因此乘2直接扫,最后答案除以2就行了。把所有值插入一个 Trie,然后就能快速找到和数 \(a\) xor 的第 \(k\) 大值了。
产生当前最大值的方式也很套路。我们把与每个 \(s_i\) xor 得到的第一大值插入一个大根堆,然后每次取堆顶累加入答案,若当前取出了与 \(s_i\) xor 的第 \(k\) 大值,那将与 \(s_i\) xor 的第 \(k+1\) 大值插入堆即可。
若我们需要前 \(k\) 大值,那迭代 \(k\) 轮后就是答案。
这题的 \(k\) 可以拓展到 \(O(n^2)\) 的级别。现在查询的方式是确定 xor 的对象来搞的,我们也可以直接在 Trie 上二分,先查出第 \(k\) 大,再求出前 \(k\) 大。具体看这篇。
好少好少好少jjdw牛的
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/chitchat220923.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。