分析

我用的主席树维护qwq

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
int le,ri,sum;
};
node d[*];
int n,m,q,val[],rt[],cnt;
vector<int>v[];
struct Tree {
int kk,dfn[],fin[],fa[],pa[][],T;
vector<int>vv[];
inline int sf(int x){return fa[x]==x?x:fa[x]=sf(fa[x]);}
inline void dfs(int x){
dfn[x]=++T;
for(int i=;i<;i++)pa[x][i]=pa[pa[x][i-]][i-];
for(int i=;i<vv[x].size();i++)dfs(vv[x][i]);
fin[x]=T;
}
inline void work(){
int i,j,k;
for(i=;i<=n;i++)fa[i]=i;
if(kk){
for(i=n;i;i--)
for(j=;j<v[i].size();j++)
if(i<v[i][j]){
k=sf(v[i][j]);
if(k==i)continue;
vv[i].push_back(k);
fa[k]=pa[k][]=i;
}
dfs();
}else {
for(i=;i<=n;i++)
for(j=;j<v[i].size();j++)
if(i>v[i][j]){
k=sf(v[i][j]);
if(k==i)continue;
vv[i].push_back(k);
fa[k]=pa[k][]=i;
}
dfs(n);
}
}
inline int go(int x,int len){
int i,j,k;
for(i=;i>=;i--)
if(pa[x][i]&&((kk&&pa[x][i]>=len)||(!kk&&pa[x][i]<=len)))
x=pa[x][i];
return x;
}
};
Tree A,B;
inline void update(int &x,int y,int le,int ri,int k){
d[++cnt]=d[y];
d[cnt].sum++;
x=cnt;
if(le==ri)return;
int mid=(le+ri)>>;
if(mid>=k)update(d[x].le,d[y].le,le,mid,k);
else update(d[x].ri,d[y].ri,mid+,ri,k);
}
inline int que(int a,int b,int le,int ri,int x,int y){
if(le>=x&&ri<=y)return d[a].sum-d[b].sum;
int mid=(le+ri)>>,Ans=;
if(mid>=x)Ans+=que(d[a].le,d[b].le,le,mid,x,y);
if(mid<y)Ans+=que(d[a].ri,d[b].ri,mid+,ri,x,y);
return Ans;
}
int main(){
int i,j,k,x,y;
scanf("%d%d%d",&n,&m,&q);
for(i=;i<=m;i++){
scanf("%d%d",&x,&y);
x++,y++;
v[x].push_back(y);
v[y].push_back(x);
}
A.kk=;A.work();B.work();
for(i=;i<=n;i++)val[A.dfn[i]]=B.dfn[i];
for(i=;i<=n;i++)update(rt[i],rt[i-],,n,val[i]);
for(i=;i<=q;i++){
int s,t,le,ri;
scanf("%d%d%d%d",&s,&t,&le,&ri);
s++,t++,le++,ri++;
s=A.go(s,le),t=B.go(t,ri);
if(que(rt[A.fin[s]],rt[A.dfn[s]-],,n,B.dfn[t],B.fin[t]))puts("");
else puts("");
}
return ;
}

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

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

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

  2. [IOI2018] werewolf 狼人

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

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

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

  4. P4899 【[IOI2018] werewolf 狼人】

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

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

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

  6. [Luogu4899][IOI2018] werewolf 狼人

    luogu sol \(\mbox{IOI2018}\)的出题人有没有看过\(\mbox{NOI2018}\)的题目呀... \(\mbox{Kruskal}\)重构树+二维数点. 题目相当于是问你从 ...

  7. luogu P4899 [IOI2018] werewolf 狼火

    传送门 首先很显然,从人形起点出发能到的点和狼形能到终点的点都是一个联通块,如果能从起点到终点则说明这两个联通块有交 这个时候可以请出我们的克鲁斯卡尔重构树,即对原图分别建两棵重构树,一棵边权为两端点 ...

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

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

  9. @loj - 2865@ 「IOI2018」狼人

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 在日本的茨城县内共有 N 个城市和 M 条道路.这些城市是根据人 ...

随机推荐

  1. 应用安全-Web安全-子域名/相关域名

    技巧 DNS解析记录 主站获取 单点登录接口 crossdomain.xml IP反查 通过HTTPS证书收集 DNS域传送搜集 联系人信息/邮箱反查域名 x-dns-prefetch-control ...

  2. Mac013--Docker安装

    一.Docker安装教程 参考:http://www.runoob.com/docker/macos-docker-install.html 可应用brew命令安装,也可自定义下载安装. 应用brew ...

  3. 移动端自动化测试之Appium的工作原理学习

    Appium 简介 参考官网文档说明:http://appium.io/docs/en/about-appium/intro/ Appium官方文档上介绍,Appium 是一个自动化测试的开源工具,支 ...

  4. Java判断一个日期是否在下周日期区间

    Java实现判断一个日期是否在下周日期区间的方法 /** * 判断输入的日期是否在下周区间 * @return * @author nemowang */ public static boolean ...

  5. Codeforces 843D (Dijkstra算法的优化,动态最短路)

    题面 (http://codeforces.com/problemset/problem/843/D) 题目大意: 给定一张带权无向图,有q次操作 操作有两种 1 v 询问1到v的最短路 2 c 将边 ...

  6. 数组去重,排序,重复次数,两个数组合并,两个数组去重,map(),filter(),reduce()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. python学习第四十六天dir( )函数用法

    dir( )函数有点像目录的意思,但是他是包含由模块定义的名称的字符串的排序列表.这个列表包含模块中定义的所有模块,变量和函数的名称. 列举其用法 import time content = dir( ...

  8. bzoj3156 防御准备(斜率优化)

    Time Limit: 10 Sec  Memory Limit: 512 MB Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Out ...

  9. CSS3实现小于1px的边框(移动端)

    <!doctype html> <html lang="en"> <head> <meta content="width=dev ...

  10. 回溯--- Permutations

    46.Permutations (Medium)](https://leetcode.com/problems/permutations/description/) [1,2,3] have the ...