[UOJ407]Werewolf
题意:给一个无向图和一些询问$(S,E,L,R)$,问能否实现:从$S$出发,经过一些编号$\geq L$的节点后再通过编号$\leq R$的节点到达$E$
先对每条边$(x,y)$以$\max(x,y)$的边权构建最小生成树的kruskal重构树,那么$\leq R$的限制转为在子树内,再以$\min(x,y)$的边权构建最大生成树的kruskal重构树,那么$\geq L$的限制同样转为在子树内,问题变为:求两棵树的两个子树中是否含有编号相同的节点
dfs一遍,每个节点以第一棵树的dfs序为横坐标,以第二棵树的dfs序为纵坐标,那么询问就是矩形数点,直接用可持久化线段树就可以了
#include"werewolf.h"
#include<vector>
#include<algorithm>
using namespace std;
struct pr{
int x,y;
pr(int a=0,int b=0){x=a;y=b;}
}e[400010],p[400010];
bool operator<(pr a,pr b){return a.x<b.x;}
bool cmp1(pr a,pr b){return max(a.x,a.y)<max(b.x,b.y);}
bool cmp2(pr a,pr b){return min(a.x,a.y)>min(b.x,b.y);}
int sfa[400010];
int get(int x){return x==sfa[x]?x:(sfa[x]=get(sfa[x]));}
struct tree{
int h[400010],nex[400010],to[400010],M,n;
void add(int a,int b){
M++;
to[M]=b;
nex[M]=h[a];
h[a]=M;
}
int fa[400010][19],val[400010],in[400010],ou[400010],p[400010];
void dfs(int x){
in[x]=++M;
p[M]=val[x];
for(int i=h[x];i;i=nex[i]){
fa[to[i]][0]=x;
dfs(to[i]);
}
ou[x]=M;
}
void gao(){
int i,j;
M=0;
dfs(n);
for(j=1;j<19;j++){
for(i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
int geq(int x,int v){
if(val[x]<v)return 0;
for(int i=18;i>=0;i--){
if(fa[x][i]&&val[fa[x][i]]>=v)x=fa[x][i];
}
return x;
}
int leq(int x,int v){
if(val[x]>v)return 0;
for(int i=18;i>=0;i--){
if(fa[x][i]&&val[fa[x][i]]<=v)x=fa[x][i];
}
return x;
}
}t1,t2;
struct seg{
int l,r,s;
}t[8000010];
int rt[400010],M;
void insert(int pr,int&nr,int p,int l,int r){
nr=++M;
t[nr]=t[pr];
t[nr].s++;
if(l==r)return;
int mid=(l+r)>>1;
if(p<=mid)
insert(t[pr].l,t[nr].l,p,l,mid);
else
insert(t[pr].r,t[nr].r,p,mid+1,r);
}
int query(int L,int R,int l,int r,int x){
if(x==0)return 0;
if(L<=l&&r<=R)return t[x].s;
int mid=(l+r)>>1,s=0;
if(L<=mid)s+=query(L,R,l,mid,t[x].l);
if(mid<R)s+=query(L,R,mid+1,r,t[x].r);
return s;
}
int N;
int query(int x,int y,int L,int R){
return query(L,R,1,N,rt[y])-query(L,R,1,N,rt[x-1]);
}
vector<int>check_validity(int n,vector<int>X,vector<int>Y,vector<int>S,vector<int>E,vector<int>L,vector<int>R){
int m,q,i,j,x,y;
m=X.size();
q=S.size();
for(i=0;i<m;i++)e[i+1]=pr(X[i]+1,Y[i]+1);
sort(e+1,e+m+1,cmp1);
for(i=1;i<n*2;i++)sfa[i]=i;
for(i=1;i<=n;i++)t1.val[i]=i;
N=n;
for(i=1;i<=m;i++){
x=get(e[i].x);
y=get(e[i].y);
if(x!=y){
N++;
t1.add(N,x);
t1.add(N,y);
t1.val[N]=max(t1.val[x],t1.val[y]);
sfa[x]=sfa[y]=N;
}
}
t1.n=N;
t1.gao();
sort(e+1,e+m+1,cmp2);
for(i=1;i<n*2;i++)sfa[i]=i;
for(i=1;i<=n;i++)t2.val[i]=i;
N=n;
for(i=1;i<=m;i++){
x=get(e[i].x);
y=get(e[i].y);
if(x!=y){
N++;
t2.add(N,x);
t2.add(N,y);
t2.val[N]=min(t2.val[x],t2.val[y]);
sfa[x]=sfa[y]=N;
}
}
t2.n=N;
t2.gao();
for(i=1;i<=n;i++)p[i]=pr(t1.in[i],t2.in[i]);
sort(p+1,p+n+1);
for(i=1;i<=n;i++){
for(j=p[i-1].x+1;j<=p[i].x;j++)rt[j]=rt[j-1];
insert(rt[p[i].x],rt[p[i].x],p[i].y,1,N);
}
vector<int>ans(q);
for(i=0;i<q;i++){
x=t2.geq(S[i]+1,L[i]+1);
y=t1.leq(E[i]+1,R[i]+1);
ans[i]=query(t1.in[y],t1.ou[y],t2.in[x],t2.ou[x])?1:0;
}
return ans;
}
[UOJ407]Werewolf的更多相关文章
- WereWolf项目 Postmortem
WereWolf项目 Postmortem (博客园的MarkDown编辑器好像有些问题,编号都显示1..) 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...
- Werewolf流程分析
werewolf大致流程 首先是房主创建房间,创建成功以后房主开启web socket连接. 其他成员加入房间,加入房间后新成员和老成员的游戏玩家列表都会更新,然后新成员也要开启web socket连 ...
- ural 1242. Werewolf
1242. Werewolf Time limit: 1.0 secondMemory limit: 64 MB Knife. Moonlit night. Rotten stump with a ...
- URAL 1242 Werewolf(DFS)
Werewolf Time limit: 1.0 secondMemory limit: 64 MB Knife. Moonlit night. Rotten stump with a short b ...
- PAT 1148 Werewolf - Simple Version
1148 Werewolf - Simple Version (20 分) Werewolf(狼人杀) is a game in which the players are partitioned ...
- PAT A1148 Werewolf - Simple Version (20 分)——暴力遍历,负负得正
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- [IOI2018] werewolf 狼人
[IOI2018] werewolf 狼人 IOI2018题解 (其实原题强制在线,要用主席树) 代码: 注意: 1.下标从0~n-1 2.kruskal重构树开始有n个节点,tot从n开始,++to ...
- [IOI2018] werewolf 狼人 kruskal重构树,主席树
[IOI2018] werewolf 狼人 LG传送门 kruskal重构树好题. 日常安利博客文章 这题需要搞两棵重构树出来,这两棵重构树和我们平时见过的重构树有点不同(据说叫做点权重构树?),根据 ...
- uoj407 【IOI2018】狼人
link 题意: 给一张n个点m条边的无向图,有q个询问,每次询问给出s,t,l,r,问你能否从s走到t,并且初始为人形,结束时必须为狼形,你是人形的时候必须避开$[1,l)$的节点,狼形的时候必须避 ...
随机推荐
- patch需要数据格式前端算法,patch算法基础,两个对象对比取差异属性
在我们的前端开发过程中,表单是最常见不过的了,一般我们创建表单的时候习惯使用post方法来提交数据,编辑表单时候喜欢put,但是当表单的数据非常多的时候,编辑起来很麻烦,首先需要获取初始化数据,然后把 ...
- Warning: File upload error - unable to create a temporary file in Unknown on line 0
upload_tmp_dir 临时文件夹问题 上传文件提示 Warning: File upload error - unable to create a temporary file in Unkn ...
- [NOI2008] [bzoj1061] 志愿者招募
还是一道费用流的题目.话不多说,进入正题. 题意:给定n个点和m种从l到r覆盖一层的费用,求满足所有点的覆盖层数都大等于权值的最小费用 分析:要做到区间修改,看似比较麻烦. 用差分把区间修改变成单点修 ...
- perl6中的q/qq/qx/qqx
q不内插 qq内插 qx不内插 qqx内插
- ThinkPHP5 模型 - 事务支持
使用事务之前,先确保数据库的存储引擎支持事务操作. MyISAM:不支持事务,主要用于读数据提高性能 InnoDB:支持事务.行级锁和并发 Berkeley DB:支持事务 ThinkPHP5 使用事 ...
- x64dbg
https://x64dbg.com/ https://github.com/x64dbg/x64dbg https://sourceforge.net/projects/x64dbg/files/s ...
- 可以高度定制的代理服务器anyproxy
简介 anyproxy是一款可以高度定制的代理服务器,基于nodejs. 特征 支持https明文代理 支持低网速模拟 支持二次开发,可以用javascript控制代理的全部流程,搭建前端个性化调试环 ...
- springboot项目的搭建
原文链接:http://www.cnblogs.com/winner-0715/p/6666302.html 后续完善(附图及详细过程)
- JWT认证不通过导致不能访问视图的解决方案
在做商城项目的购物车模块时,发现了一个问题. 需求:当用户登录时,添加商品到购物车的数据保存在redis.当用户未登录时,添加商品到购物车的数据保存在cookies.两个功能都写在一个视图里面.以JW ...
- [转载]NGINX原理分析 之 SLAB分配机制
作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.09.15 23:19 转载请注明来自&q ...