传送门 题意简述:支持在某个历史版本上修改某一个位置上的值,访问某个历史版本上的某一位置的值. 思路: 用主席树直接维护历史版本即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();} whil…
题目链接 Solution 主席树水题,连差分的部分都不需要用到. 直接用主席树的结构去存一下就好了. Code #include<bits/stdc++.h> #define mid (l+r)/2 using namespace std; const int maxn=2000008; int T[maxn],tot,n,m; int ch[maxn*10][2]; int a[maxn],id[maxn]; int w[maxn*10],num; int read() { char ch…
题目大意:需要维护一个长度为 N 的数组,支持在历史版本上单点修改和单点查询. 题解:显然,如果直接暴力维护的话会 MLE.因此,采用线段树进行维护,使得空间复杂度由 \(O(mn)\) 降至 \(O(mlogn)\),不过相应的时间复杂度由 \(O(1)\) 上升至 \(O(logn)\). 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; inline int read(){ int f=1,…
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> #include<algorithm> #include<ctime> #include<queue> #inc…
题目传送门 可持久化数组 题目描述 如题,你需要维护这样的一个长度为 $N$ 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本.版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组) 输入输出格式 输入格式: 输入的第一行包含两个正整数 $N, M$, 分别表示数组的长度和操作的个数. 第二行包含 $N$ 个整数,依次为初始状态下数组各位…
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度. 目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分 重链剖分 实际上我们经常讲的树剖,就是重链剖分的常用称呼. 对于每个点,选择最大的子树,将这条连边划分为重边,而连向其他子树的边划分为轻边. 若干重边连接在…
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. 输入输出格式 输入格式: 第一行两个整数N,M. 第二行有N个整数,其中第i个整数表示点i的权值. 后面N-1行每行两个整数(x,y),表示点x到点y有一条边. 最后M行每行两个整数(u,v,k),表示一组询问. 输出格式: M行,表示每个询问的答案. 输入输出样例 输入样例#1:…
题面 洛谷 题解 考虑暴力,对于询问中的一段区间\([l,r]\),我们先将其中的数升序排序,假设当前可以表示出\([1,k]\)目前处理\(a_i\),假如\(a_i>k+1\),则答案就是\(k+1\),否则,调整右界到\(k+a_i\). 考虑如何优化,还是扫到了\([1,k]\),假设\(ans=k+1\),如果所有小于等于\(ans\)的数的和\(sum\)起来大于等于\(ans\),则一定可以将\(k\)更新成\(sum\).否则直接输出就好了. 以上这个过程很明显可以用主席树维护,…
题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\(s_m\)的数的数量要么相等,要么小于比大于等于多一个.后一种情况当且仅当\(s_m\in [a,b]\)且序列长度为奇数. 考虑如果已知一个数\(s_i\),如何判断是否存在区间\([e,f]\)(\(e\in [a,b],f\in [c,d]\))使\([e,f]\)的中位数大于等于\(s_i\…
LOJ 题目链接 & 洛谷题目链接 题意:商店里有 \(n\) 杯果汁,第 \(i\) 杯果汁有美味度 \(d_i\),单价为 \(p_i\) 元/升.最多可以添加 \(l_i\) 升.有 \(m\) 次询问,每次给出两个数 \(G,L\),你可以将商店里的一些果汁混合起来,使得他们的总体积不小于 \(L\) 升,总价格不超过 \(G\) 元,问:选择的果汁中美味度最小值的最大值是多少. \(1 \leq n,m \leq 10^5\),\(1 \leq d_i,p_i,l_i \leq 10^…