[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)$的节点,狼形的时候必须避 ...
随机推荐
- DotNETCore 学习笔记 WebApi
API Description Request body Response body GET /api/todo Get all to-do items None Array of to-do ite ...
- for in、each; for 、forEach、map
1.jQuery.each(object, [callback]) 用于例遍任何对象.回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容.如果需要退出 each 循环可使回调 ...
- ubuntu tomcat的安装与配置
一.下载jdk 大概是tomat大部分是由java写的, 所以一开始安装tomcat必须得配置好jdk http://www.oracle.com/technetwork/java/javase/do ...
- 搭建selenium+python自动化环境
1.安装python,下载地址:http://python.org---安装版本3.5.1 ps:自带setuptools和pip工具 2.然后,用pip安装开发Web App需要的第三方库:异步框架 ...
- Smarty模板快速入门
文件下载 1.下载地址:http://www.smarty.net/ 2.我下载的版本是3.1.27 ,将下载的文件smarty-3.1.27.zip解压出来,然后将libs文件夹的所有文件复制到你的 ...
- 查看mysql的版本和端口号
查看版本:select version(); 查看端口号:show global variables like 'port';
- PHP-5.3.27源码安装及nginx-fastcgi配置
源码安装php cat /etc/redhat-release uname -rm wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.c ...
- JavaScript跨域解决方法大全
跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...
- IntelliJ IDEA SpringBoot 使用第三方Tomcat以及部署
花了半天时间终于成功,记录以备查阅. 一.第三方Tomcat部署 部署部分参考的是:把spring-boot项目部署到tomcat容器中 目标:把spring-boot项目按照平常的web项目一样发布 ...
- 深度学习方法:受限玻尔兹曼机RBM(四)对比散度contrastive divergence,CD
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入 上篇讲到,如果用Gibbs Sa ...