题目大意:

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. Linux命令学习(4):gzip压缩与解压

    版权声明:本文为博主原创文章,未经允许不得转载 引子 gzip是Linux系统中最常用也是高效的压缩压缩命令.早期Linux系统中主要使用compress命令压缩,得到后缀为“.Z”的压缩文件,但是后 ...

  2. 【makefile】symbol <函数> : can't resolve symbol 问题分析

    调试程序的时候,在linux编译器上可以编译通过,但是编译生成的firmware烧录到板子上的后出现以下异常: can't resolve symbol,无法解析元素符号. review一下code, ...

  3. 详细了解为什么支持Postman Chrome应用程序已被弃用?

    本地postman chrome插件确实也无法正常使用,只有Postman官方自己的软件应用程序可以使用.笔者多少追溯终于知道原因,并紧急上线了不同操作系统版本的Postman应用程序. 为什么近期P ...

  4. python实现tcp文件下载器

    服务器端代码 import socket import os import threading # 处理客户端请求下载文件的操作(从主线程提出来的代码) def deal_client_request ...

  5. Django的forms包部分重要用法:

    from django.forms import fields from django.forms import Form from django.forms import widgets 在view ...

  6. 【Codeforces 1041D】Glider

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分. 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) ...

  7. CodeForcesGym 100517H Hentium Scheduling

    Hentium Scheduling Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  8. .net如何统计在线人数

    原文发布时间为:2008-10-17 -- 来源于本人的百度文章 [由搬家工具导入] 统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能, ...

  9. Linux下汇编语言学习笔记27 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. SOJ 2930_积木城堡

    [题意]若干个城堡,给定每个城堡的积木数及每块积木的棱长.从城堡中抽出积木使每块城堡高度相同,求最大高度 [分析]城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装 ...