题目大意:

n个城市构成一个树 m支军队 每只军队守卫 在xi到yi的最短路径上的城市

q个重要人物从vi出发 找到离根最近的点使从vi到这个点上所有路径都可以被至少ki个军队完全覆盖

输出每个答案的点的深度

思路:

对于每个军队 可以拆成两个链

在深度较大的节点的权值线段树上把深度较低的点+1

然后合并线段树

查询的时候查询子树线段树中第k小的

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#define inf 2139062143
#define ll long long
#define MAXN 200100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,f[MAXN][],dep[MAXN],hsh[MAXN],sz[MAXN],val[MAXN<<];
int nxt[MAXN<<],fst[MAXN],to[MAXN<<],cnt,rt[MAXN],ls[MAXN<<],rs[MAXN<<];
void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
void dfs(int x)
{
hsh[x]=++cnt,sz[x]=;
for(int i=;(<<i)<=dep[x];i++) f[x][i]=f[f[x][i-]][i-];
for(int i=fst[x];i;i=nxt[i])
if(to[i]!=f[x][]){dep[to[i]]=dep[x]+,f[to[i]][]=x;dfs(to[i]);sz[x]+=sz[to[i]];}
}
int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int t=dep[u]-dep[v];
for(int i=;i<=;i++)
if((<<i)&t) u=f[u][i];
if(u==v) return u;
for(int i=;i>=;i--)
if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return f[u][];
}
void inst(int &k,int l,int r,int x)
{
if(!k) k=++cnt;
val[k]++;
if(l==r) return ;
int mid=(l+r)>>;
if(x<=mid) inst(ls[k],l,mid,x);
else inst(rs[k],mid+,r,x);
}
void merge(int &a,int b)
{
if(!a) {a=b;return ;}
if(!b) return ;
val[a]+=val[b];
merge(ls[a],ls[b]);
merge(rs[a],rs[b]);
}
int query(int k1,int k2,int l,int r,int a,int b)
{
if(!k1) return ;
if(l==a&&r==b) return val[k1]-val[k2];
int mid=(l+r)>>;
if(b<=mid) return query(ls[k1],ls[k2],l,mid,a,b);
else if(a>mid) return query(rs[k1],rs[k2],mid+,r,a,b);
else return query(ls[k1],ls[k2],l,mid,a,mid)+query(rs[k1],rs[k2],mid+,r,mid+,b);
}
int ans(int k1,int k2,int l,int r,int x)
{
//cout<<l<<" "<<r<<" "<<val[k1]-val[k2]<<" "<<x<<endl;
if(l==r) return l;
int mid=(l+r)>>;
if(x<=val[ls[k1]]-val[ls[k2]]) return ans(ls[k1],ls[k2],l,mid,x);
else return ans(rs[k1],rs[k2],mid+,r,x-val[ls[k1]]+val[ls[k2]]);
}
int main()
{
n=read(),m=read();int a,b,c;
for(int i=;i<n;i++) {a=read(),b=read();add(a,b);add(b,a);}
cnt=;dfs();cnt=;
while(m--)
{
a=read(),b=read(),c=lca(a,b);
inst(rt[hsh[a]],,n,dep[c]+);
inst(rt[hsh[b]],,n,dep[c]+);
}
for(int i=;i<=n;i++) merge(rt[i],rt[i-]);
m=read();
while(m--)
{
a=read(),b=read();
//cout<<query(rt[hsh[a]+sz[a]-1],rt[hsh[a]-1],1,n,1,dep[a]+1)<<endl;
if(query(rt[hsh[a]+sz[a]-],rt[hsh[a]-],,n,,dep[a]+)<b) puts("");
else printf("%d\n",dep[a]+-ans(rt[hsh[a]+sz[a]-],rt[hsh[a]-],,n,b));
}
}

牛客网9.9比赛 C 保护的更多相关文章

  1. [牛客网NOIP赛前集训营-提高组(第一场)]C.保护

    链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...

  2. 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  3. 牛客网NOIP赛前集训营-提高组(第一场)

    牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...

  4. 题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)

    前言 比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ 和dummyummy巨佬一起推了快三个小时的规律 最后去问了真正的巨佬__stdcall __stdcall面带微笑的告诉我们,这是 ...

  5. 2018年牛客网NOIP赛前训练营游记

    2018年牛客网NOIP赛前训练营游记 提高组(第一场) 中位数 #include<cstdio> #include<cctype> #include<climits&g ...

  6. 牛客网——E进阶吧阶乘

    链接:https://www.nowcoder.net/acm/contest/75/E来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32768K,其他语言65536K ...

  7. 牛客网 牛客练习赛43 F.Tachibana Kanade Loves Game-容斥(二进制枚举)+读入挂

    链接:https://ac.nowcoder.com/acm/contest/548/F来源:牛客网 Tachibana Kanade Loves Game 时间限制:C/C++ 1秒,其他语言2秒 ...

  8. 牛客网 牛客练习赛43 C.Tachibana Kanade Loves Review-最小生成树(并查集+Kruskal)+建虚点+读入挂

    链接:https://ac.nowcoder.com/acm/contest/548/C来源:牛客网 Tachibana Kanade Loves Review 时间限制:C/C++ 2秒,其他语言4 ...

  9. 牛客网 Wannafly挑战赛27 蓝魔法师

    蓝魔法师 链接: https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔 ...

随机推荐

  1. 安装bitcore

    官网----------------------------------------------https://bitcore.io先安装好 node.js v4,  npmsudo npm inst ...

  2. 【转载】Raft 为什么是更易理解的分布式一致性算法

    一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...

  3. http chunked 理解

    https://imququ.com/post/transfer-encoding-header-in-http.html #! /usr/bin/python #coding:utf8 import ...

  4. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  5. ECNU 3260 袋鼠妈妈找孩子(dfs)

    链接:http://acm.ecnu.edu.cn/problem/3260/ 题意: 给出一个x,y,k.求从左上角到(x,y)最短路径不少于k而且最快到达(x,y)的迷宫.(迷宫有多个 输出其中一 ...

  6. VI/VIM 编辑器

    [是什么?] VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器. VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器.可以主动的以字体颜色辨别语法的正确性,方便程序 ...

  7. JS数组添加元素的三种方式

    1.push() 结尾添加 数组.push(元素) 参数 描述 newelement1 必需.要添加到数组的第一个元素. newelement2 可选.要添加到数组的第二个元素. newelement ...

  8. 《ajax学习》之ajax+JavaScript事件验证用户名是否可注册

    当用户注册时,服务器数据库需要对用户输入的用户信息(以用户名为例子)进行验证,在不刷新页面的情况下又需要页面和服务器进行数据请求,最好的方法是用ajax异步请求. 一.实现思路: 1.用户输入信息 2 ...

  9. Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框

     Android ImageView加载圆形图片且同时绘制圆形图片的外部边缘边线及边框 在Android早期的开发中,如果涉及到圆形图片的处理,往往需要借助于第三方的实现,见附录文章1,2.And ...

  10. POJ1308/HDU1325/NYOJ129-Is It A Tree?,并查集!

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28838   Accepted: 9843 -& ...