Splendor White's blog

标签 · 算法数据结构

首页

关于

归档

loading..
算法数据结构题解数据结构交互题树链剖分

LOJ6669 Nauuo and Binary Tree 解题笔记

题目来源 LOJ6669 Nauuo and Binary Tree 题意简述 这是一道交互题。 有一棵以 111 为根的二叉树,你可以询问任意两点之间的距离,求出每个点的父亲。 节点数不超过 300030003000 ,你最多可以进行 300003000030000 次询问。 解题思路 观察数据范围可知,本题可以接受 O(n2)O(n^2)O(n2) 的时间复杂度,但关键在于如何降低询问复杂度。 显然,本题需要由浅到深地逐层加入节点,否则就无从下手。 设当前待插入的节点为 xxx 。 又由于本题的树满足二叉树的特殊性质,所以可以考虑 xxx 是去左子树还是右子树。 如果暴力询问 xxx 到左儿子和右儿子的距离,选择走哪一棵子树,最坏询问复杂度为 O(n2)O(n^2)O(n2) ,具体情况如下图。 ..

更多
算法数据结构题解数据结构树链剖分

P3384 【模板】重链剖分/树链剖分 树剖提高模板

题目来源 P3384 【模板】重链剖分/树链剖分 题意简述 已知一棵包含 NNN 个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 1 x y z,表示将树从 xxx 到 yyy 结点最短路径上所有节点的值都加上 zzz。 2 x y,表示求树从 xxx 到 yyy 结点最短路径上所有节点的值之和。 3 x z,表示将以 xxx 为根节点的子树内所有节点值都加上 zzz。 4 x 表示求以 xxx 为根节点的子树内所有节点值之和 1≤N≤1051\le N \leq {10}^51≤N≤105,1≤M≤1051\le M \leq {10}^51≤M≤105,1≤R≤N1\le R\le N1≤R≤N,1≤P≤231−11\le P \le 2^{31}-11≤P..

更多
算法数据结构题解数据结构莫队

P1494 [国家集训队] 小Z的袜子 解题笔记

题目来源 P1494 [国家集训队] 小 Z 的袜子 题意简述 有一个长度为 nnn 的序列 {ci}\{c_i\}{ci​}。现在给出 mmm 个询问,每次给出两个数 l,rl,rl,r,从编号在 lll 到 rrr 之间的数中随机选出两个不同位置的数,求两个数相等的概率。 n,m≤5×104,ci≤nn,m\le5\times10^4,c_i\le nn,m≤5×104,ci​≤n 解题思路 本题保证 ci≤nc_i\le nci​≤n 。事实上,如果不满足这个条件,我们也可以对序列做离散化操作,因为数字的绝对大小与解题无关。 cic_ici​ 的值域相当有限,于是便可以考虑用桶来维护区间中不同数字的数量。 每次移动区间端点后,只需要考虑新加进来的这个数和前面的数相等的概率是多少,经过某些 O(1..

更多
算法数据结构题解

Codeforces-Till I Collapse 解题笔记

题目来源 Codeforces Round 406 (Div. 1) C. Till I Collapse Vjudge页面 题意简述 长度为 nnn 的正整数序列 aia_iai​ ,数字表示颜色。将序列划分成尽可能少的连续段,每段中颜色的数量不能超过 kkk 。对于所有的 k∈[1,n]k\in[1,n]k∈[1,n] 输出答案。 n≤1×105,ai≤nn\le1\times10^5,a_i\le nn≤1×105,ai​≤n 解题思路 暴力的贪心做法是,对于一个确定的 kkk ,从左往右进行划分,尽可能把每一段划分得更长。因为所有的段都是连续的,一个接一个排列,显然,这样的贪心策略不会使得答案更劣。暴力的复杂度为 O(nk)O(nk)O(nk) 。 显然,确定一个区间端点后,区间长度越大,区间..

更多
算法数据结构题解数据结构分块排序

SPOJ Give Away 解题笔记

简直和 UVA-12003 Array Transformer 解题笔记 一模一样。 把这题写一遍单纯是为了巩固分块实现能力。 实际写起来还真的 WA 了一发,确实有很多易错的地方,绝知此事要躬行。 尤其是循环的对象问题。是循环原序列还是块序列?想清楚再写。 #include<bits/stdc++.h> #define N 500100 #define Q 100100 using namespace std; int n,x[N],q; int op,a,b,c; int id[N],len,num; vector<int> block[N]; inline void change(int a, int b){ int aid = id[a]; x[a] = ..

更多
算法数据结构题解数据结构分块排序树状数组

UVA-11990 Dynamic Inversion 解题笔记

题目来源 UVA - 11990 Dynamic Inversion Vjudge 页面 题意简述 将一个 n≤2×105n\le 2\times10^5n≤2×105 的排列逐个删去 m≤1×105m\le1\times10^5m≤1×105 个元素,问每次删除元素之前,排列中有多少个逆序对。 解题思路 本题和 UVA-12003 Array Transformer 解题笔记 几乎一模一样,都是分块并在每次修改后保持块内有序,由此可使用二分查找实现高效的查询。 在求逆序对数量初值的时候使用树状数组即可,此后每一次删掉一个数字就查询其左侧比它大的数的数量,在总逆序对数量中减掉即可。 保持块内有序的方式依然可以使用冒泡排序,减少一个 log⁡\loglog 。 与 UVA-12003 实在太像了,代码略..

更多
算法数据结构题解数据结构分块排序

UVA-12003 Array Transformer 解题笔记

题目来源 UVA - 12003 - Array Transformer Vjudge 页面 题意简述 长度为 n≤3×105n\le 3\times10^5n≤3×105 的序列做 m≤5×104m\le 5\times10^4m≤5×104 次操作,每次操作询问 [L,R][L,R][L,R] 之间小于 vvv 的数的个数 kkk ,然后将 apa_pap​ 修改为 ⌊u∗kR−L+1⌋\displaystyle \left\lfloor \frac{u*k}{R-L+1} \right\rfloor⌊R−L+1u∗k​⌋ 。 解题思路 显然这题用线段树是很容易解的,不过我把这个题当做分块的练习题来做,不使用任何树形数据结构。 假设块长为 sss 每次修改完后将 ppp 所在块内的数据排序,复杂度..

更多
算法数据结构题解数据结构分块

LOJ6280 分块入门 区间和 解题笔记

题目来源 LibreOJ 6280 数列分块入门 4 题意简述 序列区间加与查询区间和, n≤5×104n\le5\times 10^4n≤5×104 。 解题思路 分块,操作区间中不是整块的部分暴力求解,是整块的部分打标记。 重点在时间复杂度的计算上。 最坏复杂度为操作区间几乎覆盖整个序列时,此时中间的整块数量近似于 ns\displaystyle\frac{n}{s}sn​ ,两端的非整块长度为 2s2s2s 。忽略常数,单次操作最坏时间复杂度为 O(ns+s)\displaystyle O(\frac{n}{s}+s)O(sn​+s) 。 运用基本不等式 ns+s≥2ns⋅s=2n\displaystyle\frac{n}{s}+s\ge2\sqrt{\frac{n}{s}\cdot s}=2\..

更多
算法数据结构题解数论gcd唯一分解定理

P5150 生日礼物 题解

虽然题目不难,但背后蕴含的考点还是很有意思的。 本题的核心考点是唯一分解定理。 此考点曾在NOIP中涉及,非常重要!!! 例如 NOIP2009 Hankson的趣味题 唯一分解定理:设 pip_ipi​ 表示第 iii 个质数,那么对于任意正整数NNN,都有唯一的一组 a1,a2,a3…ana_1,a_2,a_3\dots a_na1​,a2​,a3​…an​ ,使得 N=p1a1×p2a2×p3a3×⋯×pnanN=p_1^{a_1}\times p_2^{a_2}\times p_3^{a_3}\times\dots\times p_n^{a_n} N=p1a1​​×p2a2​​×p3a3​​×⋯×pnan​​ 其中 aia_iai​ 可以等于000。 用白话文说:任何数都可以表示为他的质因数们的若..

更多
12