[IOI2018] werewolf 狼人】的更多相关文章

[IOI2018] werewolf 狼人 IOI2018题解 (其实原题强制在线,要用主席树) 代码: 注意: 1.下标从0~n-1 2.kruskal重构树开始有n个节点,tot从n开始,++tot #include<bits/stdc++.h> #define reg register int #define il inline #define numb (ch^'0') using namespace std; typedef long long ll; il void rd(int…
[IOI2018] werewolf 狼人 LG传送门 kruskal重构树好题. 日常安利博客文章 这题需要搞两棵重构树出来,这两棵重构树和我们平时见过的重构树有点不同(据说叫做点权重构树?),根据经过我们简化的建树方法,这两棵树不再是二叉树,但是仍具有kruskal重构树的优秀性质,建议结合后面的描述理解. 看这题需要首先我们从\(S\)走到\(T\)转化为分别从\(S\)和\(T\)出发寻找能共同到达的点,需要快速求出从某个点出发经过点权不大(小)于\(r\)(\(l\))的点,考虑kru…
P4899 [IOI2018] werewolf 狼人 LOJ#2865.「IOI2018」狼人,第一次AC交互题 kruskal 重构树+主席树 其实知道重构树的算法的话,难度就主要在主席树上 习惯从 \(1\) 开始标号,所以以下讲解中的标号都是从 \(1\) 开始的 从 \(s\) 开始走,只走点 \(L,L+1,\cdots,n\),能走到的点集记为 \(V_1\) 从 \(e\) 开始,只走 \(1,2,\cdots,R\),能走到的点集记为 \(V_2\) 则,若 \(V_1\cap…
luogu sol \(\mbox{IOI2018}\)的出题人有没有看过\(\mbox{NOI2018}\)的题目呀... \(\mbox{Kruskal}\)重构树+二维数点. 题目相当于是问你从\(S\)出发只经过\(\ge L\)的点,和从\(T\)出发只经过\(\le R\)的点有没有交集. 分别建两棵最大/最小\(\mbox{Kruskal}\)重构树,这样从\(S\)出发,从\(T\)出发能到达的点就分别是两棵树上的一个子树.以点在两棵树上的\(dfs\)序作为两维坐标,每次询问就…
感觉已经几次碰到这种类型的题目了,写篇\(Blog\)总结一下 题意: 是否存在一条\((s_i, t_i)\)的路径,满足先只走编号不超过\(L_i\)的点,再走编号不超过\(R_i\)的点 \(Solution\): 对于这种限定经过点数的题目,可以比较自然地想到重构树: 由于前后都有限定,我们考虑建两颗重构树 第一颗按照边权为两个端点编号的最小值构建重构树,重构树每个点的点权\(x\)表示不经过边权超过\(x\)的边能到达的所有点: 第二颗则按照边权为两个端点最大值来构建重构树,重构树上每…
分析 我用的主席树维护qwq 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<queue> #in…
题意: 当你是人形的时候你只能走 \([L,N-1]\) 的编号的点(即大于等于L的点) 当你是狼形的时候你只能走 \([1,R]\) 的编号的点(即小于等于R的点) 然后问题转化成人形和狼形能到的点有没有交集. solution: 发现可以建 kruskal重构树,就可以通过在树上倍增来求出来一个子树,这个子树内是你可以到的点.然后问题转化成了两个子树区间的交,这个问题可以用主席树解决. 定义 \(rev1_i\) 是在树上的第 \(i\) 个位置对应的数,那你定义 \(r_{rev1_i}=…
先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度最浅的节点,该节点子树内所有原图中的点,狼形从\(x\)都能到达. 同样的,人形构建重构树就是边权为两端点编号的较小值,按最大生成树的顺序. 先构建这两棵\(Kruskal\)重构树,对于每次询问,只需查询起点和终点分别树上倍增后子树内的节点是否有交即可. 判断有交可以通过\(dfs\)序.设两棵重…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 在日本的茨城县内共有 N 个城市和 M 条道路.这些城市是根据人口数量的升序排列的,依次编号为 0 到 N-1.每条道路连接两个不同的城市,并且可以双向通行.由这些道路,你能从任意一个城市到另外任意一个城市. 你计划了 Q 个行程,这些行程分别编号为 0 至 Q-1.第 i(0 <= i <= Q - 1)个行程是从城市 Si 到城市 Ei. 你是一个狼人.你…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵kruskal重构树,不断询问,每次询问让你判断是否有点同时存在于 第一棵树的一个子树 和 第二棵树的一个子树中. 这个东西就转成dfs序之后主席树搞一搞就好了. 代码 #include <bits/stdc++.h> #include "werewolf.h" #define clr…