数据结构训练之一
https://www.luogu.org/problem/P3224 题目特性: 动态维护,询问 范围第k大 能够想到的是 并查集 , 权值线段树 ,但是它是动态维护啊, 会加边啊 ,怎么办? 权值线段树合并 ,并查集维护,动态开点保证 空间复杂度 ; 清晰明了的代码 code: #include <cctype> #include <cstdio> using namespace std; const int maxn=1e5+5, maxseg=maxn*20;//动态开点线段树空间是NlogN int n, m, q, v[maxn], id[maxn], fa[maxn]; int cnt, root[maxn], lc[maxseg], rc[maxseg], seg[maxseg]; void get(int &x){ int flag=1; char c; for (c=getchar(); !isdigit(c); c=getchar()) if (c=='-') flag=-1; for (x=c-48; c=getchar(), isdigit(c); ) x=(x<<3)+(x<<1)+c-48; x*=flag; } int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); } void add(int