luogu

sol

\(\mbox{IOI2018}\)的出题人有没有看过\(\mbox{NOI2018}\)的题目呀。。。

\(\mbox{Kruskal}\)重构树+二维数点。

题目相当于是问你从\(S\)出发只经过\(\ge L\)的点,和从\(T\)出发只经过\(\le R\)的点有没有交集。

分别建两棵最大/最小\(\mbox{Kruskal}\)重构树,这样从\(S\)出发,从\(T\)出发能到达的点就分别是两棵树上的一个子树。以点在两棵树上的\(dfs\)序作为两维坐标,每次询问就是问你某个矩形区域里面有没有点。

code

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 4e5+5;
struct president_tree{int ls,rs,sz;}t[N*35];
int n,m,q,val[N],rt[N],tot;
vector<int>E[N];
struct Kruskal_rebuild_tree{
int ty;
int fa[N],nxt[N],hd[N],pa[20][N],dfn[N],low[N],tim;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void dfs(int u){
dfn[u]=++tim;
for (int j=1;j<20;++j) pa[j][u]=pa[j-1][pa[j-1][u]];
for (int v=hd[u];v;v=nxt[v]) dfs(v);
low[u]=tim;
}
void work(){
for (int i=1;i<=n;++i) fa[i]=i;
if (ty){
for (int u=n;u;--u)
for (int v:E[u])
if (u<v){
v=find(v);if (u==v) continue;
nxt[v]=hd[u],hd[u]=v,fa[v]=pa[0][v]=u;
}
dfs(1);
}else{
for (int u=1;u<=n;++u)
for (int v:E[u])
if (u>v){
v=find(v);if (u==v) continue;
nxt[v]=hd[u],hd[u]=v,fa[v]=pa[0][v]=u;
}
dfs(n);
}
}
int jump(int u,int k){
for (int j=19;~j;--j)
if (pa[j][u]&&((ty&&pa[j][u]>=k)||(!ty&&pa[j][u]<=k)))
u=pa[j][u];
return u;
}
}A,B;
void modify(int &x,int l,int r,int p){
t[++tot]=t[x];++t[x=tot].sz;
if (l==r) return;int mid=l+r>>1;
if (p<=mid) modify(t[x].ls,l,mid,p);
else modify(t[x].rs,mid+1,r,p);
}
int query(int x,int y,int l,int r,int ql,int qr){
if (l>=ql&&r<=qr) return t[x].sz-t[y].sz;
int mid=l+r>>1,s=0;
if (ql<=mid) s+=query(t[x].ls,t[y].ls,l,mid,ql,qr);
if (qr>mid) s+=query(t[x].rs,t[y].rs,mid+1,r,ql,qr);
return s;
}
int main(){
n=gi();m=gi();q=gi();
for (int i=1;i<=m;++i){
int u=gi()+1,v=gi()+1;
E[u].push_back(v);E[v].push_back(u);
}
A.ty=1;A.work();B.work();
for (int i=1;i<=n;++i) val[A.dfn[i]]=B.dfn[i];
for (int i=1;i<=n;++i) modify(rt[i]=rt[i-1],1,n,val[i]);
while (q--){
int s=gi()+1,e=gi()+1,l=gi()+1,r=gi()+1;
s=A.jump(s,l);e=B.jump(e,r);
puts(query(rt[A.low[s]],rt[A.dfn[s]-1],1,n,B.dfn[e],B.low[e])?"1":"0");
}
return 0;
}

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

  1. [IOI2018] werewolf 狼人

    [IOI2018] werewolf 狼人 IOI2018题解 (其实原题强制在线,要用主席树) 代码: 注意: 1.下标从0~n-1 2.kruskal重构树开始有n个节点,tot从n开始,++to ...

  2. [IOI2018] werewolf 狼人 kruskal重构树,主席树

    [IOI2018] werewolf 狼人 LG传送门 kruskal重构树好题. 日常安利博客文章 这题需要搞两棵重构树出来,这两棵重构树和我们平时见过的重构树有点不同(据说叫做点权重构树?),根据 ...

  3. [LOJ2865] P4899 [IOI2018] werewolf 狼人

    P4899 [IOI2018] werewolf 狼人 LOJ#2865.「IOI2018」狼人,第一次AC交互题 kruskal 重构树+主席树 其实知道重构树的算法的话,难度就主要在主席树上 习惯 ...

  4. Luogu4899 IOI2018 Werewolf 主席树、Kruskal重构树

    传送门 IOI强行交互可还行,我Luogu的代码要改很多才能交到UOJ去-- 发现问题是对边权做限制的连通块类问题,考虑\(Kruskal\)重构树进行解决. 对于图上的边\((u,v)(u<v ...

  5. P4899 【[IOI2018] werewolf 狼人】

    感觉已经几次碰到这种类型的题目了,写篇\(Blog\)总结一下 题意: 是否存在一条\((s_i, t_i)\)的路径,满足先只走编号不超过\(L_i\)的点,再走编号不超过\(R_i\)的点 \(S ...

  6. p4899 [IOI2018] werewolf 狼人

    分析 我用的主席树维护qwq 代码 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  7. [IOI2018] werewolf 狼人 [kruskal重构树+主席树]

    题意: 当你是人形的时候你只能走 \([L,N-1]\) 的编号的点(即大于等于L的点) 当你是狼形的时候你只能走 \([1,R]\) 的编号的点(即小于等于R的点) 然后问题转化成人形和狼形能到的点 ...

  8. 题解 洛谷 P4899 【[IOI2018] werewolf 狼人】

    先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度 ...

  9. Luogu4899 IOI2018狼人(kruskal重构树+主席树)

    可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集.于是建出重构树,就可以知道每个询问的连通情况了.现在要知 ...

随机推荐

  1. (2)基本工作流(制作场景与UI)

    1.认识cocos编辑器主界面.   2.制作新场景:   1)打开我们新建的HelloCocos项目,新建场景名称为“Scene”,如下图:   2)点击新建,场景就被创建出来了,如下图:   3) ...

  2. ng-深度学习-课程笔记-9: 机器学习策略1(Week1)

    1 为什么要应用机器学习策略( Why is machine learning strategy ) 当你想优化一个问题的时候,通常可以有很多尝试(比如收集更多数据,增加迭代次数,改用adam,改变网 ...

  3. CSS3:{*zoom:1;}作用

    CSS3:{*zoom:1;}作用 zoom:1的常见作用: zoom是IE专用属性,firefox等是不支持的.它的本来作用是设置或检索对象的缩放比例,但这作用几乎用不到. 可以让网页实现IE7中的 ...

  4. js 变量、函数提升 与js的预编译有关

    参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = ...

  5. Spring JPA中OneToOne和OneToMany用法

    Spring工程中,创建实体对象时,可以通过JPA的@Entity标识实体与数据库表的对应关系,@Column标识数据库字段.其中还有标识两个实体间关系的注解:@OneToOne.@OneToMany ...

  6. 获取本机IP,返回字符串

    public static String GetLocalIp() { String[] Ips = GetLocalIpAddress(); foreach (String ip in Ips) i ...

  7. Ubuntu16.04 安装JDK Tomcat

    Ubuntu16.04安装jdk,下载linux中的64版本 需要下载jdk,tomcat安装包 tar.gz版本的 http://pan.baidu.com/s/1mi4WVhA 安装JDK: ho ...

  8. CodeForces 450B Jzzhu and Sequences(矩阵快速幂)题解

    思路: 之前那篇完全没想清楚,给删了,下午一上班突然想明白了. 讲一下这道题的大概思路,应该就明白矩阵快速幂是怎么回事了. 我们首先可以推导出 学过矩阵的都应该看得懂,我们把它简写成T*A(n-1)= ...

  9. NOIP 2018 兔纸旅游记

    今年是第一次参加tg呢... Day0    早上出发去中旅坐大巴,走有 lz 特色的OI比赛道路. 车上谈笑风生,看 jw 的 GDOI 的小本本. 到动车站取票入站,看 lmh 和 zn 的爱恨情 ...

  10. 《重构网络-SDN架构与实现》阅读随笔

    <重构网络-SDN架构与实现>: SDNLAB <重构网络-SDN架构与实现>新书有奖试读活动 资源下载 随笔 有幸拜读了李呈前辈和杨泽卫杨老师的作品<重构网络-SDN架 ...