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

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…
分析 我用的主席树维护qwq 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<queue> #in…
[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…
感觉已经几次碰到这种类型的题目了,写篇\(Blog\)总结一下 题意: 是否存在一条\((s_i, t_i)\)的路径,满足先只走编号不超过\(L_i\)的点,再走编号不超过\(R_i\)的点 \(Solution\): 对于这种限定经过点数的题目,可以比较自然地想到重构树: 由于前后都有限定,我们考虑建两颗重构树 第一颗按照边权为两个端点编号的最小值构建重构树,重构树每个点的点权\(x\)表示不经过边权超过\(x\)的边能到达的所有点: 第二颗则按照边权为两个端点最大值来构建重构树,重构树上每…
先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度最浅的节点,该节点子树内所有原图中的点,狼形从\(x\)都能到达. 同样的,人形构建重构树就是边权为两端点编号的较小值,按最大生成树的顺序. 先构建这两棵\(Kruskal\)重构树,对于每次询问,只需查询起点和终点分别树上倍增后子树内的节点是否有交即可. 判断有交可以通过\(dfs\)序.设两棵重…
luogu sol \(\mbox{IOI2018}\)的出题人有没有看过\(\mbox{NOI2018}\)的题目呀... \(\mbox{Kruskal}\)重构树+二维数点. 题目相当于是问你从\(S\)出发只经过\(\ge L\)的点,和从\(T\)出发只经过\(\le R\)的点有没有交集. 分别建两棵最大/最小\(\mbox{Kruskal}\)重构树,这样从\(S\)出发,从\(T\)出发能到达的点就分别是两棵树上的一个子树.以点在两棵树上的\(dfs\)序作为两维坐标,每次询问就…
传送门 首先很显然,从人形起点出发能到的点和狼形能到终点的点都是一个联通块,如果能从起点到终点则说明这两个联通块有交 这个时候可以请出我们的克鲁斯卡尔重构树,即对原图分别建两棵重构树,一棵边权为两端点较小值,边权从大到小排序后构建,另一棵反过来,所以构完后第一棵重构树某个点权值要小于等于子树内的点,第二棵某点权值大于等于子树内点 对于一个询问,起点在第一棵树向上倍增找深度最浅,权值\(\ge l\)的祖先x,终点在第二棵树向上倍增找深度最浅,权值\(\le l\)的祖先y,那么x和y就是上面说到…
题意: 当你是人形的时候你只能走 \([L,N-1]\) 的编号的点(即大于等于L的点) 当你是狼形的时候你只能走 \([1,R]\) 的编号的点(即小于等于R的点) 然后问题转化成人形和狼形能到的点有没有交集. solution: 发现可以建 kruskal重构树,就可以通过在树上倍增来求出来一个子树,这个子树内是你可以到的点.然后问题转化成了两个子树区间的交,这个问题可以用主席树解决. 定义 \(rev1_i\) 是在树上的第 \(i\) 个位置对应的数,那你定义 \(r_{rev1_i}=…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 在日本的茨城县内共有 N 个城市和 M 条道路.这些城市是根据人口数量的升序排列的,依次编号为 0 到 N-1.每条道路连接两个不同的城市,并且可以双向通行.由这些道路,你能从任意一个城市到另外任意一个城市. 你计划了 Q 个行程,这些行程分别编号为 0 至 Q-1.第 i(0 <= i <= Q - 1)个行程是从城市 Si 到城市 Ei. 你是一个狼人.你…
快咕一个月了 咕咕咕 咕咕咕咕 LOJ #2865 Luogu P4899(离线) UOJ #407(强制在线) 题意 给定一棵树和若干组询问$(S,E,L,R)$ 表示你初始在$S$,想到达$E$,有一次变身机会,变身前经过的点的编号不得小于$L$,变身后不得大于$R$ 判断每组询问是否可行 数据范围差不多都是$2·10^5$ 题解 原问题等价于[从$ S$点出发不经过编号小于$ L$的点能到达的点集]和[从$ E$点出发不经过编号大于$ R$的点能到达的点集]是否有交 维护一棵最大克鲁斯卡尔…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵kruskal重构树,不断询问,每次询问让你判断是否有点同时存在于 第一棵树的一个子树 和 第二棵树的一个子树中. 这个东西就转成dfs序之后主席树搞一搞就好了. 代码 #include <bits/stdc++.h> #include "werewolf.h" #define clr…
link 题意: 给一张n个点m条边的无向图,有q个询问,每次询问给出s,t,l,r,问你能否从s走到t,并且初始为人形,结束时必须为狼形,你是人形的时候必须避开$[1,l)$的节点,狼形的时候必须避开$(r,n]$的节点,你只能在$[L,R]$的节点处变身? $n,q\leq  2\times 10^5,m\leq 4\times 10^5.$ 题解: get技能——Kruskal重构树 重构树是一个类似堆的结构,节点u比它的所有儿子v的权都要来的小/大(在这题中都有用到),可以用并查集建树.…
http://uoj.ac/problem/407 分析: 分别建立最小/最大kruskal重构树. 每次询问给出的两个点能走到的部分分别对应两棵树\(dfs\)序的一段区间. 转化成判断矩形中是否有点. 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <cmath> #include "werewolf.…
传送门 IOI强行交互可还行,我Luogu的代码要改很多才能交到UOJ去-- 发现问题是对边权做限制的连通块类问题,考虑\(Kruskal\)重构树进行解决. 对于图上的边\((u,v)(u<v)\),我们建两棵\(Kruskal\)重构树,一棵按照\(u\)从大到小加边表示人形时的活动区域,一棵按照\(v\)从小到大加边表示狼形时的活动区域. 那么我们的每组询问就变为了:给出两段区间,询问是否存在一个点同时覆盖这两个区间(即人形转换为狼形的地点).这个是经典的二维数点问题,使用主席树计算即可.…
虽然作为IOI的Day1T3,但其实不是一道很难的题,或者说这道题其实比较套路吧. 接下来讲解一下这个题的做法: 如果你做过NOI 2018的Day1T1,并且看懂了题面,那你很快就会联想到这道题,因为两者都是问某一个点能到达的点集,只不过限制在点上还是边上的问题. $Kruskal$重构树可以把在边上的限制转化成点上的,于是能解决NOI 2018的Day1T1:那么这道题就可以直接做,因为限制已经在点上了. 具体来讲,从$s$点只能走编号$>=l$的点,那么我们就构建一棵树,使得任意一个非根节…
其实也不是多难的知识点吧--学了一个中午+半个下午就把它学会了(做过那道 jxd 作业 CF571D 的应该比较好理解) Kruskal 重构树大概就是在正常 Kruskal 的时候,对于两个需要连边的点 \(u,v\) 不直接连边,而是新增一个虚拟节点 \(T\),权值为 \(u,v\) 间的边权 \(w\),并连边 \(T\to u,T\to v\). 下图可以较为清楚地展示 Kruskal 重构树的过程,正常的 Kruskal 我们是这样连边的: 而 Kruskal 重构树我们是这样连边的…
只有部分题解 练习赛 T2 自然还是要简单考虑了 0~n-1的排列,考虑相对的大小 我们先考虑对于前三个:a,b,c 询问a,b,询问b,c,再询问a,b,c 发现,如果三个知道两个,那么第三个可以唯一确定 所以分情况讨论一下: 1.a>b,不妨钦定a=n-1,然后得到a,b,c的值,再询问(c,d),(b,c,d)...就可以得到所有的值 2.a<b,不妨钦定a=0,然后得到a,b,c的值,再询问(c,d),(b,c,d)...就可以得到所有的值 这里,由于a的值是钦定的,可能得到某个值是负…
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noip前的杂题训练,我也很无奈啊 做完了的扔最后,欢迎好题推荐 这么多题肯定是完不成了,能多做一道是一道吧 DP yyb真是强得不要不要的辣:http://www.cnblogs.com/cjyyb/category/1036536.html [ ] [SDOI2010]地精部落 https://www…
kruskal重构树 kruskal重构树,顾名思义,是在kruskal的时候顺便搞出来的一棵重构树,具体地说是一个堆. 先说说这个东西是怎么搞出来的吧:默认事先把边按边权从小到大排序,在kruskal的时候,如果当前加入的边连接的两个点\(x\)和\(y\)不在同一个连通块中,就新建一个节点作为\(x\)和\(y\)所在树的根节点的父亲,令这个节点的权值为这条边的权值,还有一般kruskal也要做的把并查集合并:在同一个连通块中就不管. 从模板题看看重构树的性质:BZOJ3732 Networ…
Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事情. kruskal求最小生成树的过程,如果把加入的一个边新建一个节点的话,并且把k1,k2的father设为新点的话,会得到一个2*n大小的树 实际上已经非常明白地表示kruskal这个过程了.这个树叫kruskal重构树 每个点的权值定义为所代表的边的权值.叶子节点权值最优. 由于贪心,所以树上所有点,…
1. 例题引入:BZOJ3551 用一道例题引入:BZOJ3551 题目大意:有 \(N\) 座山峰,每座山峰有他的高度 \(h_i\).有些山峰之间有双向道路相连,共 \(M\) 条路径,每条路径有一个困难值,这个值越大表示越难走,现在有 \(Q\) 组询问,每组询问询问从点 \(v\) 开始只经过困难值小于等于 \(x\) 的路径所能到达的山峰中第 \(k\) 高的山峰的高度,如果无解输出 \(-1\).强制在线. 这道题的离线做法可以是线段树合并,可以参照我之前写过的一篇文章,里面有提到:…
题目链接: IOI2018werewolf 题目大意:给出一张$n$个点$m$条边的无向图,点和边可重复经过,一个狼人初始为人形,有$q$次询问,每次询问要求人形态只能处于编号不小于$L$的点,狼形态只能处于编号不大于$R$的点,询问能否从$S$处于人形态然后在编号在$[L,R]$内的点变身一次成为狼人然后到达 $E$. 题目中编号都是从0开始,太不舒服了,我们按编号从1开始讲QAQ. 题目大意就是询问每次从一个点开始走只能走编号在[l,n]中的点,在任意点变成狼,之后只能走[0,r]中的点,是…
[IOI2018]狼人 luogu UOJ 对人形和狼形分别建克鲁斯卡尔重构树 每次询问就是对于两棵树dfs序的一个二维数点,主席树维护 #include<bits/stdc++.h> using namespace std; const int _=4e5+5; int re(){ int x=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'…
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入这些点的边),我们可以得到两棵树(和那两题不一样的是这题的权值在点上,不需要新建节点). 对于询问\((S,T,L,R)\),可以倍增找出\(S,T\)可以在哪棵子树中随便走. 那么只需要判断两棵子树是否有交就可以惹. 注意到子树的DFS序是连续的,我们可以在第一个子树的某个数据结构上,查第二个子树…
可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集.于是建出重构树,就可以知道每个询问的连通情况了.现在要知道的是两个连通块的交集,考虑每个点是否有可能在里面.于是按照两棵重构树的dfs序给每个点一个二维坐标,问题就变为二维数点了,主席树即可. 注意编号从0开始. #include<iostream> #include<cstdio> #include<cmath> #inclu…
哇!济南的 rqy 大佬讲课!就是 $luogu$ 上有名的那位! 上面这句话写错了,请大家无视 XylophoneIOI2018 练习赛 T2题意:交互提有一个 $0\sim n-1$ 的排列,保证 $0$ 在 $n-1$ 左边.你每次可以询问一个区间,会得到这个区间的 最大值 $-$最小值.要用不超过 $10000$ 次询问还原出这个排列.范围:子任务 $1$($11pts$)$n\le 100$子任务 $2$($36pts$)$n\le 1000$子任务 $3$($53pts$)$n\le…
WereWolf项目 Postmortem (博客园的MarkDown编辑器好像有些问题,编号都显示1..) 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是用来解决玩狼人杀这款桌游时无牌.无法官.游戏流程不熟悉等情况的.我觉得我们对典型用户和典型场景描述的较为清楚,我们项目之前做了问卷调查,提出了一些功能,Alpha版本挑了用户较需要的几个功能重点实现,之后在Beta阶段我们将继续完善其余功能. 是否有充足的时间来做计划? 与后面…
werewolf大致流程 首先是房主创建房间,创建成功以后房主开启web socket连接. 其他成员加入房间,加入房间后新成员和老成员的游戏玩家列表都会更新,然后新成员也要开启web socket连接. 然后,应该有一个房主锁定房间\解锁房间的按钮,效果是不允许再有新玩家加入房间. 然后,所有人的界面跳到选择座位,每个人选择以后服务器会返回是否选择成功. 房主默认是1号座位,所有人都选择成功以后,房主点击进入游戏设置界面,但是这里好像其他人需要点击下一步才可以(最好改成房主设置好以后所有人都直…
1242. Werewolf Time limit: 1.0 secondMemory limit: 64 MB   Knife. Moonlit night. Rotten stump with a short black-handled knife in it. Those who know will understand. Disaster in the village. Werewolf. There are no so many residents in the village. Ma…