重要的事情说三遍

不保证图联通

不保证图联通

不保证图联通

那些和我一样认为重构树是点数的童鞋是要GG


Description

【题目描述】同3545

Input

第一行三个数N,M,Q。

第二行N个数,第i个数为h_i

接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。

接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。

Output

同3545

Sample Input

Sample Output

HINT

【数据范围】同3545


思路

bzoj3545强制在线版本

数据鬼畜

然后大概造数据的人没考虑这个问题

直接kruskal重构树跑一下

然后因为kruskal重构树是二叉堆

所以可以到达的点就变成了一个子树

然后就直接先倍增再用主席树可持久化一下dfs序查询区间第k大就可以了


#include<bits/stdc++.h>

using namespace std;

int read() {
int res = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) res = res * 10 + c - '0', c = getchar();
return res;
} const int N = 2e5 + 10;
const int M = 5e5 + 10; struct Edge {
int u, v, w, nxt;
bool operator < (const Edge &b) const {
return w < b.w;
}
} P[M], E[M]; int n, m, q, pre[N], h[N], w[N];
int Fa[N], head[N], tot = 0; int find(int x) {
return x == Fa[x] ? x : Fa[x] = find(Fa[x]);
} void addedge(int u, int v) {
E[++tot] = (Edge) {u, v, 0, head[u]};
head[u] = tot;
} int Kruskal() {
sort(P + 1, P + m + 1);
for (int i = 1; i <= n * 2; i++) Fa[i] = i;
int ind = n;
for (int i = 1, cnt = 0; i <= m; i++) {
int fau = find(P[i].u), fav = find(P[i].v);
if (fau == fav) continue;
++ind;
Fa[fau] = Fa[fav] = ind;
addedge(ind, fau);
addedge(ind, fav);
w[ind] = P[i].w;
if (++cnt == n - 1) break;
}
return ind;
} int ind = 0, id[N];
int bg[N], ed[N];
int fa[N][20]; void dfs(int u, int father) {
fa[u][0] = father;
for (int i = 1; i <= 18; i++)
fa[u][i] = fa[fa[u][i - 1]][i - 1];
if (u <= n) {
id[++ind] = u;
bg[u] = ind;
} else {
bg[u] = ind + 1;
}
for (int i = head[u]; i; i = E[i].nxt) {
int v = E[i].v;
if (v == father) continue;
dfs(v, u);
}
ed[u] = ind;
} int rt[N], ls[N * 30], rs[N * 30], siz[N * 30], cnt = 0; void insert(int &t, int last, int l, int r, int pos) {
t = ++cnt;
siz[t] = siz[last] + 1;
if (l == r) return;
ls[t] = ls[last];
rs[t] = rs[last];
int mid = (l + r) >> 1;
if (pos <= mid) insert(ls[t], ls[last], l, mid, pos);
else insert(rs[t], rs[last], mid + 1, r, pos);
} int query(int rtl, int rtr, int l, int r, int k) {
if (siz[rtr] - siz[rtl] < k) return -1;
if (l == r) return pre[l];
int mid = (l + r) >> 1, sizr = siz[rs[rtr]] - siz[rs[rtl]];
if (k <= sizr) return query(rs[rtl], rs[rtr], mid + 1, r, k);
else return query(ls[rtl], ls[rtr], l, mid, k - sizr);
} int findpos(int u, int vl) {
for (int k = 18; k >= 0; k--)
if (fa[u][k] && w[fa[u][k]] <= vl) // **
u = fa[u][k];
return u;
} int main() {
#ifdef dream_maker
freopen("input.txt", "r", stdin);
#endif
n = read(), m = read(), q = read();
for (int i = 1; i <= n; i++)
pre[i] = h[i] = read();
for (int i = 1; i <= m; i++)
P[i].u = read(), P[i].v = read(), P[i].w = read();
int root = Kruskal();
sort(pre + 1, pre + n + 1);
int num = unique(pre + 1, pre + n + 1) - pre - 1;
for (int i = 1; i <= n; i++)
h[i] = lower_bound(pre + 1, pre + num + 1, h[i]) - pre;
dfs(root, 0);
for (int i = 1; i <= n; i++)
insert(rt[i], rt[i - 1], 1, num, h[id[i]]);
int lastans = 0;
while (q--) {
int v, x, k;
scanf("%d %d %d", &v, &x, &k);
v ^= lastans, x ^= lastans, k ^= lastans;
v = findpos(v, x);
printf("%d\n", lastans = query(rt[bg[v] - 1], rt[ed[v]], 1, num, k));
if (lastans < 0) lastans = 0;
}
return 0;
}

BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】的更多相关文章

  1. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  2. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  3. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  4. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  5. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  6. 【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

    这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,L ...

  7. BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增

    建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...

  8. BZOJ3551 Peaks加强版 [Kruskal重构树,主席树]

    BZOJ 思路 我觉得这题可持久化线段树合并也可以做 我觉得这题建出最小生成树之后动态点分治+线段树也可以做 还是学习一下Kruskal重构树吧-- Kruskal重构树,就是在做最小生成树的时候,如 ...

  9. BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增

    题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...

  10. 【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)

    题意:在Bytemountains有N座山峰,每座山峰有他的高度h_i. 有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走, 现在有Q组询问,每组询问询问从点v开始只 ...

随机推荐

  1. Codeforces 913C - Party Lemonade

    913C - Party Lemonade 思路:对于第i个话费cost[i],取min(cost[i],2*cost[i-1]),从前往后更新,这样就可以保证第n个的话费的性价比最高,那么从最高位开 ...

  2. SVN提交文件失败:系统找不到指定路径

    完成程序代码工作后,进行SVN的文件提交.先进行项目的更新,然后在修改的文件上进行提交操作,发现SVN弹出提示信息,“系统找不到指定路径”提交失败,如下图:                       ...

  3. 3.5 MIPS体系结构

    计算机组成 3 指令系统体系结构 3.5 MIPS体系结构 MIPS是精简指令系统的代表,采用了与X86相反的设计理念,并引领了精简指令系统的潮流,那就让我们一起来看一看这究竟是怎么一回事. 要探讨M ...

  4. (GoRails) 自动侦测用户的时区,使用javascript 的jszt库。

    传统方法见:http://www.cnblogs.com/chentianwei/p/9369904.html ⚠️: 两个方法最后都要有controller中的类似before_action :se ...

  5. git 系统找不到 指定的路径

    git 系统找不到 指定的路径   %HOMEDRIVE%%HOMEPATH% Home         问题解决

  6. CAS 服务端数据库认证

    CAS-服务端数据库认证 数据认证需要相关的jar包: cas-server-support-jdbc-x.x.x.jar MySQL-connector-Java-x.x.x-bin.jar 修改C ...

  7. Java——String类

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  8. 福大软工 1816:项目UML设计(团队作业三)

    项目UML设计(团队) 团队信息 团队名:第三视角 各成员学号及姓名 姓名 学号 博客链接 张扬(组长) 031602345 http://www.cnblogs.com/sxZhangYang/p/ ...

  9. Socket缓冲区

    1.由于可读状态是在对方写入数据后或socket关闭时才能出现,因此如果客户端和服务端都停留在read时,如果没有任何一方,向对方写入数据,这将会产生一个死锁. 2.此外,在本地接收操作发起之前,很可 ...

  10. 获取bean的两种方式

    BeanFactory方式: 1: public void testFactory(){ ResourcePatternResolver rpt=new PathMatchingResourcePat ...