分析

我用的主席树维护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. Eigen的aligned_allocator

    今天看ORBSLAM2中的OptimizeEssentialGraph()函数时,对一句代码中的aligned_allocator不太清楚: vector<g2o::Sim3,Eigen::al ...

  2. Symmetric Tree(对称二叉树)

    来源:https://leetcode.com/problems/symmetric-tree Given a binary tree, check whether it is a mirror of ...

  3. Django的ORM常用查找操作总结

    作者:python技术人 博客:https://www.cnblogs.com/lpdeboke/ 首先这里给出一个用户信息model class UserModel(models.Model): u ...

  4. 加密算法:DES、AES等

    指标:运算速度.安全性.资源消耗 对称加密算法(加解密密钥相同): 非对称算法(加密密钥和解密密钥不同): 散列算法比较: 对称与非对称算法比较: 算法选择(从性能和安全性综合) 对称加密: AES( ...

  5. 《剑指offer》面试题19 二叉树的镜像 Java版

    书中方法:这道题目可能拿到手没有思路,我们可以在纸上画出简单的二叉树来找到规律.最后我们发现,镜像的实质是对于二叉树的所有节点,交换其左右子节点.搞清楚获得镜像的方法,这道题实际上就变成了一道二叉树遍 ...

  6. [2019CCPC网络赛][hdu6704]K-th occurrence(后缀数组&&主席树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6704 题意为查询子串s[l...r]第k次出现的位置. 写完博客后5分钟的更新 写完博客才发现这份代码 ...

  7. F. Fixing Banners

    http://codeforces.com/gym/102394/problem/F F. Fixing Banners time limit per test 1 second memory lim ...

  8. selenium自动新增店铺

    说明:仅作为参考练习,代码中涉及数据均为测试数据. from selenium import webdriver from selenium.webdriver import ActionChains ...

  9. ReentrantLock等待通知机制Condition介绍

    Object类中的wait(),notify()和notifyAll()可以实现线程的等待通知模型,同样在ReentrantLock中可以借助Condition来完成这种机制.本篇就简要介绍Condi ...

  10. sudo、su、suid

    sudo 是一种权限管理机制,管理员可以授权普通用户去执行 root 权限的操作,而不需要知道 root 的密码.sudo 以其他用户身份执行命令,默认以root身份执行.配置文件/etc/sudoe ...