[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中,第k小的权值是多少.此操作保证点x和点y连通,同时这两个节点的路径上至少有k个点. L x y在点x和点y之间连接一条边.保证完成此操作后,仍然是一片森林. 分析 用并查集维护连通性以及每个联通块的大小 用主席树维护路径上第k大,第x棵主席树维护的是节点x到根的链上权值的出现情况,类似[BZOJ2…
看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> #include<algorithm> #define read(x) x=getint() using namespace std; const int N = 1E5; int getint() { int k = 0, fh = 1; char c = getchar(); for(;…
#include<cstdio> #include<iostream> #include<algorithm> #define M 200009 //#define N 100000 using namespace std; struct data { int x,y,a1,yy; }a[M]; struct dat { int F,id; }b[M]; ,ans[M],N; bool mark[M]; bool cmp(data b1,data b2) { retur…