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..
更多P3379 最近公共祖先 树剖基础模板
来不及解释了,直接上代码 #include<bits/stdc++.h> #define ll long long #define N 500100 using namespace std; ll n,m,s,x,y,a,b; vector<ll> g[N]; bool vis[N]; ll fa[N],dep[N],siz[N],son[N]; ll top[N],tot,dfn[N],rnk[N]; inline void dfs1(ll root, ll depth){ vis[root] = true; dep[root] = depth; ll maxSon = 0; for(auto soni : g[root]){ if(vis[s..
更多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..
更多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\..
更多高级数据结构 学习笔记
前言 本文主要根据 OIwiki 的数据结构部分展开,也按照常见的考点加入了一些图论、字符串领域的数据结构。本文只包含最基本的理论介绍,相关的实现方式、具体的解题思路和代码都放在站内其他文章中。 后续做到比较好的数据结构题也会添加进这篇文章中来。 块状数据结构 分块初步 经典例题1:参见站内文章 LOJ6280 分块入门 区间和 解题笔记 总体思路:寻找一种合理的分块方式,操作区间中不是整块的部分暴力求解,是整块的部分打标记。 寻找最优分块方式,通常是对最坏时间复杂度求最小值,取得最小值时的约束条件可以得到最优块长。 在分块的基础上,依然可以使用差分、前缀和等方式来优化算法。差分、前缀和不仅可以对原序列使用,也可以对块序列使用。 相关注意事项: 块长不一定等于块数。 区间两端点在同一个块中,必须特判..
更多my first blog
This is a test. This is another test
更多