CF1039D You Are Given a Tree LG传送门 根号分治好题. 这题可以整体二分,但我太菜了,不会. 根号分治怎么考虑呢?先想想\(n^2\)暴力吧.对于每一个要求的\(k\),一遍dfs直接贪心,能拼成链就直接拼,正确性不用我证明吧. 考虑对于\(k \le \sqrt n\),直接按照暴力去做,复杂度\(O(n \sqrt n)\):对于\(k\)从\(\sqrt n+1\)到\(n\)的所有情况,我们发现答案只会在\(\sqrt n\)到\(0\)之间取值(\(k>…
传送门 似乎直接做不太好做-- 当你不会做的时候就可以考虑根号算法了(或许是这样的 考虑如果只有一个询问如何计算答案. 显然是可以贪心的,思路与NOIP2018D1T3是相同的.每一个点向上传一条链,对于某一个点,如果从儿子传上来的所有链中最长的两条的长度之和\(\geq k\)就连上,否则就把其中最长的那一条传上去. 然后考虑所有询问. 可以发现:对于链长\(>\sqrt{n}\)的所有询问,最多只有\(\sqrt{n}\)种答案. 所以对于链长\(\leq \sqrt{n}\)的询问暴力计算…
正题 题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意 给出\(n\)个点的一棵树,然后对于\(k\in[1,n]\)求每次使用一条长度为\(k\)的链覆盖树并且不能重复覆盖点时最大覆盖条数. \(1\leq n\leq 10^5\) 解题思路 先考虑暴力怎么做,因为每条链的价值都是一,显然的一种贪心思想是能合并的就合并(没有让出一条链给另一条链腾空间的必要). 这样的复杂度是\(O(n)\)的,但是对于每个都要求所以需要优化. 之后考虑上根号…
洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地把子树升上来的两条最长的链拼在一起,能组就组,否则把最长链往上送,复杂度\(O(n)\). 那么多个\(k\)怎么办呢? 分析一波,\(k<\sqrt{n}\)时可以暴力计算,而\(k>\sqrt{n}\)时\(ans_k\leq \lfloor \frac{n}{k}\rfloor\),只有\(…
题意 给你\(n\)个点的树,其中一个简单路径的集合被称为\(k\)合法当且仅当树的每个节点最多属于一条路径,且每条路径包含\(k\)个节点.对于每个\(k(k \in [1,n])\),输出最多的\(k\)合法路径. \(n\leq 10^5\). 分析 先考虑 \(n^2\) 的做法,每次可以贪心地合并链,正确性显然. 考虑根号分治,\(k<\sqrt n\) 时 \(O(n)\) 暴力,否则因为取值是单调的可以二分,取值不超过 \(\frac{n}{\sqrt n}=\sqrt n\) 个…
LINK:Expected diameter of a tree 1e5 带根号log 竟然能跑过! 容易想到每次连接两个联通快 快速求出直径 其实是 \(max(D1,D2,f_x+f_y+1)\) 其中\(D1,D2\)分别为两个联通块内的直径. \(f_x\)表示 从x出发的最长链. 这样容易想到 枚举一个块的点 然后其实要找到 \(C=max(D1,D2)\) 第一个位置满足\(>C-f_x-1\) 然后就能统计答案了. 排序后扫描 复杂度要高 不如排序后二分. 然后加一个记忆化就过了.…
xor There is a tree with nn nodes. For each node, there is an integer value a_ia​i​​, (1 \le a_i \le 1,000,000,0001≤a​i​​≤1,000,000,000 for 1 \le i \le n1≤i≤n). There is qq queries which are described as follow: Assume the value on the path from node…
BZOJ \(\mathbb{mod}\)一个数\(y\)的最小值,可以考虑枚举剩余系,也就是枚举区间\([0,y),[y,2y),[2y,3y)...\)中的最小值(求后缀最小值也一样)更新答案,复杂度是\(O(\frac ny)\)的.注意到\(y>\sqrt n\)时,枚举次数\(<\sqrt n\). 我们可以对\(y\)根号分治,设\(m=\sqrt{V}\)(\(V\)是值域). 当\(y\leq m\)时,可以维护一个大小为\(m\)的桶\(s_i\)(表示模数为\(i\)时的\…
[CF1039D]You Are Given a Tree 题目大意: 给定一棵\(n(n\le10^5)\)个节点的树.对于每一个正整数\(k(1\le k\le n)\),求最多能找出多少条包含\(k\)个点的路径,使得这些路径没有公共点. 思路: 答案只可能有大约\(2\sqrt n\)种,对于每一种答案二分其对应的\(k\)的范围,每次自底向上贪心地选择路径.卡卡常就可以过了. 时间复杂度\(\mathcal O(n\sqrt n\log n)\). 源代码: #include<cmat…
传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足条件的区间中最大的右端点$+1$,然后连边$(i,d_i)$ 那么我们就需要求一条链的长度,并支持动态修改某一些边 是不是有些印象?与弹飞绵羊极为相似,没有做过的可以先去感受一下…… 上面那道题有两种做法:$LCT$与分块,所以这一道题就衍生出了$O(n\sqrt{n}logn)$的基于$LCT$的…
题意 题目链接 Sol 很神仙的题 我们考虑询问(a, b)(a是b的祖先),直接对b根号分治 如果b的出现次数\(< \sqrt{n}\),我们可以直接对每个b记录下与它有关的询问,这样每个询问至多扫\(\sqrt{n}\)个点即可知道答案,那么dfs的时候暴力统计答案即可,复杂度\(q\sqrt{n}\) 如果b的出现次数\(> \sqrt{n}\),显然这样的b最多只有\(\sqrt{n}\)个,也就是说在询问中最多会有\(\sqrt{n}\)个这样的b,那么我们可以对每个a,暴力统计,…
CF1039E Summer Oenothera Exhibition LG传送门 根号分治好题. 可以先看我的根号分治总结. 题意就是给出长度为\(n\)的区间和\(q\)组询问以及一个\(w\),每次询问一个\(k\),问最少把一段给定区间划分几次可以满足每一段划分出的子区间的极差不超过\(w-k\)(以下默认\(k\)就是\(w-k\)). 这题主要有两种写法,一种是\(O(n \sqrt nlog n)\)的,一种是\(O(n^{ \frac 5 3}+n^{ \frac 4 3} lo…
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\sum|s|\le 10^5\) 分析 先建AC自动机的 \(fail\) 树, 我们考虑两种暴力: 将 \(l​\) 到 \(r​\) 中的每个串的末尾节点子树标记,查询 \(s_k​\) 的所有节点 \(fail​\) 树到根的路径和. 将 \(s_k\) 的每个节点的子树标记,查询 \(l\) 到…
题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上原力的类型.权值是一个正整数,代表这条边上的原力强度.原力技术的核心在于将R.G.B三种不同的原力融合在一起产生单一的.便于利用的原力.为了评估一个能源网络,JYY需要找到所有满足要求的三元环(首尾相接的三条边),其中R.G.B三种边各一条.一个三元环产生的能量是其中三条边的权值之积. 现在对于给出的原力网络,JYY想知道这个网络的总能量是多少.网络的总…
题目描述 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. 输入 第一行两个正整数n和m. 第二行n个数,表示A1,A2,…,An. 以下m行,每行四个数分别表示l,r,p,k.满足1<=l<=r<=n. 输出 对于每个询问,输出一行,表示可行值i的个数. 样例输入 5 2 1 5 2 3 7 1 3 2 1 2 5 3 0 样例输出 2 1 题解 根号分治+STL-vec…
LOJ 注意到\(qk \leq 10^5\),我们很不自然地考虑根号分治: 当\(k > \sqrt{10^5}\),此时\(q\)比较小,与\(qm\)相关的算法比较适合.对串\(s\)建SAM,考虑每组询问,将其所有的\((a,b)\)按照\(b\)从小到大排序,然后把\(w\)在\(s\)的SAM上匹配,每当右端点变为\(b\)的时候倍增跳到串\(s[a:b]\)的位置查询endpos即可. 当\(q > \sqrt{10^5}\),此时\(k\)比较小,与\(k^2\)相关的算法比较…
传送门 首先有\(\varphi(ij) = \frac{\varphi(i) \varphi(j) \gcd(i,j)}{\varphi(\gcd(i,j))}\),把欧拉函数的定义式代入即可证明 然后就可以开始推式子(默认\(n \leq m\)): \(\begin{align*} \sum\limits_{i=1}^n \sum\limits_{j=1}^m \varphi(ij) &= \sum\limits_{i=1}^n \sum\limits_{j=1}^m \frac{\var…
题意: 给定序列 $a,m$ 次询问,每次询问给出 $t,k$. 求 $a_{t}+a_{t+k}+a_{t+2k}+.....a_{t+pk}$ 其中 $t+(p+1)k>n$ 题解: 这种跳步数问题可以用根号分治来解决: 对于 $k$ 比较大的询问直接暴力跳,而对于 $k$ 较小的部分就通过预处理的手段来做. 我们现在只考虑 $k<\sqrt n$ 的情况,即需要我们预处理的部分. 如果直接维护 $f[i][j]$ 表示从 $i$ 开始以 $j$ 的步伐跳到 $n$ 所能得到的点权和的话空…
这是一个三元环计数的裸题,只是多了一个颜色的区分和权值的计算罢了. 有一种根号分治的做法(by gxz) 这种复杂度的证明特别显然,思路非常简单,不过带一个log,可以用unordered_map或者bitset之类的$O(1)$判连通. 我的做法的话采用了一个比较奇怪的思路?每条边,度数大的点向度数小的点连有向边,然后枚举第一层点,枚举出发到达的第二层点,这两层加起来复杂度总的是$O(m)$,然后从第二层点枚举出边到第三层点,看第三层点和第一层点是不是连通的,这个复杂度我好像在这里写过证明,就…
设节点个数大于 $\sqrt n$ 的颜色为关键颜色,那么可以证明关键颜色最多有 $\sqrt n$ 个.对于每个关键颜色,暴力预处理出该颜色到查询中另一个颜色的距离和. 对于不是关键颜色的询问,直接建立虚树进行统计即可. 由于不是关键颜色,节点数最多为 $\sqrt n$ ,那么时间复杂度是 $O(2\times n\sqrt n)$. 总时间复杂度为 $O(n\sqrt n)$,这个就叫做根号分治. #include <cstdio> #include <algorithm>…
比较容易想的题目~ 容易发现 点亮一种颜色的贡献=新增灯的数量-已经存在的边的条数. 用线段树维护并不容易.暴力的话复杂度是\(Q\cdot n\)的. 考虑根号分治 只单纯考虑度数<B的点的话 每次进行暴力 复杂度O(B). 考虑大于B的点的话 需要思考一下贡献如何快速求出. 这类点显然只有\(\frac{2n}{B}\)个 统计大于对大于的点的话复杂度O(B). 考虑大于和小于的贡献发现不能暴力了 考虑这个小于其实是之前的小于的点对当前的贡献. 那么当前的小于可以提前对这些点的贡献进行统计就…
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nqlogn就过不了了. 这里有两种解决办法: 一种是比赛的时候队友想的 一种是比较容易想到的方法. 前者套用树链剖分 只对重儿子的边进行修改 这样每次修改的复杂度为qlog. 考虑查询的时候沿着重链向上跳 这样重边可以O(1)得到答案 轻边暴力. 那么就得到了一个 nq+qlog^2的做法了. 当然可…
Link 据说这是一道论文题????.具体论文好像是 集训队论文<根号算法--不只是分块> 根号分治的裸题. 首先我们考虑暴力怎么打. 先预处理出每个模数的答案,之后再 O(1) 的回答,修改预处理O(\(n^2\)) 每次询问直接暴力统计,修改是 O (1) 的,但回答是O(\(n^2\)) 的. 这两种写法都不能通过此题. 那我们想办法把询问和修改的复杂度均摊一下. 对于模数比较少的数,我们直接暴力统计的话,会涉及到的数比较多,这样时间复杂度就上去了,所以我们采用方法一,来减少询问的复杂度…
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种是通过分成 多块后在每块上打标记以实现快速区间修改,区间查询的一种算法.根号 分治与其思路相似,将原本若一次性解决时间复杂度很高的问题分块去解 决来降低整体的时间复杂度. 例题 以本题举例子哈希冲突 本题作为论文的第一道题目,是一道很好的练习题,注意,本体给出的 \(value[i]\) 是 \(i…
正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出\(n\)个字符串\(s\).\(q\)次询问给出\(l,r,k\)要求输出\(s_{l..r}\)在\(s_k\)中出现了多少次. \(1\leq n,q,\sum |s_i|\leq 10^5\) 解题思路 考虑一个比较暴力的做法,先把所有的构出一棵\(AC\)自动机,一个串\(S\)有后缀\(T\)当且仅当在\(fail\)树上\(S\)的节点在\(T\)的子树内. 所以暴力的做法…
正题 题目链接:https://uoj.ac/problem/33 题目大意 给出\(n\)个点的一棵树 定义\(f(x,y)=gcd(\ dis(x,lca),dis(y,lca)\ )\). 对于每个\(i\)求有多少对\(f(x,y)=i(x<y)\) \(1\leq n\leq 10^5\) 解题思路 首先肯定是枚举\(lca\)节点,然后看他子树里的情况,比较麻烦的是\(gcd\)刚刚好是\(d\),但是其实我们可以是\(d\)的倍数的情况,然后后面再容斥出答案. 如果,然后暴力算的话…
正题 题目链接:http://noi.ac/problem/2266 题目大意 给出\(n\)个点的一棵树,有一些边上有中转站(边长度为\(2\),中间有一个中转站),否则就是边长为\(1\). \(m\)次询问一个东西从\(x\)出发走到\(y\),每隔\(k\)步中转站会关闭一次(\(k\)的倍数步走完后不能在中转站上).求在关闭多少次以内可以到达 \(1\leq n,m\leq 10^5\) 解题思路 发现最多只需要走\(2n\)步,然后每隔\(k\)步关闭一次,所以可以考虑根号分治. 先…
题面传送门 题意: 求有多少个数列 \(x\) 满足: \(\sum x_i=n\) \(x_i\geq x_{i+1}\) 答案对 \(p\) 取模. ...你确定这叫"入门"组? 一眼完全背包问题,然而 \(n^2\) 是根本过不了的,于是我便在那里打表找规律,结果毛用也没有( 考虑根号分治,令 \(m=\lfloor\sqrt{n}\rfloor\). 对于 \(i\leq m\) 跑一遍完全背包. 对于 \(i>m\),不难发现我们顶多会选 \(m\) 个这样的 \(i\…
题面传送门 对于这类不好直接维护的数据结构,第一眼应该想到-- 根号分治! 我们考虑记[大集合]为大小 \(\geq\sqrt{n}\) 的集合,[小集合]为大小 \(<\sqrt{n}\) 的集合. 显然,查询/修改小集合的时候,直接暴力跑一遍不会出问题,时间复杂度 \(\mathcal O(n\sqrt{n})\). 关键在于怎样处理[大集合]: 修改大集合的时候,暴力一个一个元素修改显然不行,于是考虑整体打一个 \(+v\) 的标记 \(tag_x\) 查询大集合的时候我们也不能遍历一遍集…
(才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include <bits/stdc++.h> 2 //#define loveGsy 3 #define N 1000005 4 using namespace std; 5 int f[N]; 6 7 int main() { 8 #ifdef loveGsy 9 freopen("a.in",…