牛客NOIP提高组R1 C保护(主席树)
题意
Sol
Orz lyq
我们可以把一支军队(u, v)拆分为两个(u, lca)和(v, lca)
考虑一个点x,什么时候军队对它有贡献,肯定是u或v在他的子树内,且lca在他的子树外
因为需要让至少k个军队能够完全覆盖,所以肯定是选深度第k小的
这个过程可以用dfs序+主席树来实现
拿(u, lca)来说,在dfn[u]对应的线段树中,dep[lca]处+1即可。
然后查第k大即可
/**/
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = * 1e5 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, M;
struct Node {
int siz;
}T[MAXN * ];
int root[MAXN * ], ls[MAXN * ], rs[MAXN * ];
int dep[MAXN], fa[MAXN], top[MAXN], siz[MAXN], son[MAXN], deep[MAXN], dfn[MAXN], cnt, tot, num, ID[MAXN];
vector<int> v[MAXN], Q[MAXN];//Q[i] dfs搴忎负i鐨勯渶瑕佸姞鍏ョ殑鍏冪礌
void dfs1(int x, int _fa) {
dfn[x] = ++cnt;
fa[x] = _fa; siz[x]= ; deep[x] = deep[_fa] + ;
for(int i = ; i < (int)v[x].size(); i++) {
int to = v[x][i];
if(to == _fa) continue;
dfs1(to, x);
siz[x] += siz[to];
if(siz[to] > siz[son[x]]) son[x] = to;
}
}
void dfs2(int x, int topf) {
top[x] = topf;
if(!son[x]) return ;
dfs2(son[x], topf);
for(int i = ; i < (int)v[x].size(); i++) {
int to = v[x][i];
if(top[to]) continue;
dfs2(to, to);
}
}
int LCA(int x, int y) {
while(top[x] != top[y]) {
if(deep[top[x]] < deep[top[y]]) swap(x, y);
x = fa[top[x]];
}
if(deep[x] > deep[y]) swap(x, y);
return x;
}
void Insert(int &k, int p, int l, int r, int pos) {
if(l > r) return ;
if(!k) k = ++tot, T[k].siz = T[p].siz + ;
if(l == r) return ;
int mid = (l + r) >> ;
if(pos <= mid) rs[k] = rs[p], Insert(ls[k], ls[p], l, mid, pos);
else ls[k] = ls[p], Insert(rs[k], rs[p], mid + , r, pos);
}
int Query(int rl, int rr, int k, int l, int r) {
if(T[rr].siz - T[rl].siz < k) return ;
if(l == r) return k > (T[rr].siz - T[rl].siz) ? : l;
int si = T[ls[rr]].siz - T[ls[rl]].siz;
int mid = (l + r) >> ;
if(si >= k) return Query(ls[rl], ls[rr], k, l, mid);
else return Query(rs[rl], rs[rr], k - si, mid + , r);
}
int main() {
// freopen("a.in", "r", stdin);
// freopen("b.out", "w", stdout);
N = read(); M = read();
for(int i = ; i <= N - ; i++) {
int x = read(), y = read();
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(, );
dfs2(, );
for(int i = ; i <= M; i++) {
int x = read(), y = read(), lca = LCA(x, y);
Q[dfn[x]].push_back(deep[lca]);
Q[dfn[y]].push_back(deep[lca]);
}
for(int i = ; i <= N; i++) {
for(int j = ; j < (int)Q[i].size(); j++) {
int x = Q[i][j];
++num;
Insert(root[num], root[num - ], , N, x);
}
ID[i] = num;
}
int Q = read();
while(Q--) {
int u = read(), k = read();
int ans = Query(root[ID[dfn[u] - ]], root[ID[dfn[u] + siz[u] - ]], k, , N);
if(ans == || (deep[u] - ans <= )) printf("0\n");
else printf("%d\n", deep[u] - ans);
}
return ;
}
/**/
牛客NOIP提高组R1 C保护(主席树)的更多相关文章
- 牛客NOIP提高组R1 A中位数(二分)
题意 题目链接 Sol 很神仙的题目啊,考场上只会$n^2$的暴力.. 考虑直接二分一个$mid$,我们来判断最终答案是否可能大于$x$. 判断的时候记录一下前缀最小值即可, 设$s[i]$表示$1- ...
- 牛客NOIP提高组(三)题解
心路历程 预计得分:$30 + 0 + 0 = 30$ 实际得分:$0+0+0= 0$ T1算概率的时候没模爆long long了... A 我敢打赌这不是noip难度... 考虑算一个位置的概率,若 ...
- 牛客NOIP普及组R1 C括号(dp)
题意 题目链接 Sol maya普及组的dp都要想很长时间,我真是越来越菜了qwq 设$f[i][j]$表示当前到第$i$个位置,剩下$j$个左括号没被匹配 转移的时候判断一下即可 /* */ #in ...
- 牛客NOIP提高组(二)题解
心路历程 预计得分:100 + 40 + 30 = 170 实际得分:100 + 30 + 0 = 130 T2有一个部分分的数组没开够RE了. T3好像是思路有点小问题.. 思路没问题,实现的时候一 ...
- 18/9/9牛客网提高组Day1
牛客网提高组Day1 T1 中位数 这好像是主席树??听说过,不会啊... 最后只打了个暴力,可能是n2logn? 只过了前30% qwq #include<algorithm> #in ...
- 牛客CSP-S提高组赛前集训营1
牛客CSP-S提高组赛前集训营1 比赛链接 官方题解 before:T1观察+结论题,T2树形Dp,可以换根或up&down,T3正解妙,转化为图上问题.题目质量不错,但数据太水了~. A-仓 ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
- 牛客网 提高组第8周 T1 染色
染色 链接: https://ac.nowcoder.com/acm/contest/176/A 来源:牛客网 题目描述 \(\tt{fizzydavid}\)和\(\tt{leo}\)有\(n\)个 ...
随机推荐
- Win10家庭版打不开gpedit.msc
本文来源 : https://www.ithome.com/html/win10/324926.htm win10家庭版是不自带这个功能的 首先我们打开记事本,并输入以下内容(注意空格): @echo ...
- UVALive 7511 L - Multiplication Table 数学模拟题,暴力
给定一副表,问其是否合法. 思路:当全部是?的时候,是合法的. 如果不是,那么,就找到一个数字,把它拆成若干个a*b的形式,去判断其它点是否合法即可. 拆分数字的时候,只需要枚举到sqrt(n),因为 ...
- ElasticSearch 全文检索— ElasticSearch 基本操作
REST 简介-定义 REST (REpresentation State Transfer)描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding ...
- KindEditor编辑器使用
KindEditor使用 1)kindeditor默认模式调用 <link rel="stylesheet" href="./KindEditor/themes/d ...
- windows下使用VM虚拟机安装linux
转载地址:http://blog.csdn.net/u013142781/article/details/50529030 安装过程中发现与下面的顺序有点不同,遇到的问题是: 在选择中文进行安装时,一 ...
- Magento 中一个订单的“生命历程”
当我们在网上愉快的买买买的时候, 你知道在这些屏幕“背后”正在进行着什么吗? 1. 当一个产品被加入到购物车后, 实际上发生了什么? 当第一个产品被加入到购物车, 系统首先会生成一个 quote (q ...
- poj3334(Connected Gheeves)
Connected Gheeves Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1008 Accepted: 368 ...
- pure响应式布局
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- centos7.4 安装后的基本设置
centos7.4 安装后的基本设置 设置主机名称 设置IP地址,网关 修改网卡名称 内核优化 系统安全设置 防火墙设置 ssh设置 同步系统时间 安装基础软件包 软件配置 设置主机名称 hostna ...
- Zabbix邮件报警设置方法
实现目的: 在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱. 具体操作: 以下操作在Zabbix监控服务端进行 备注:Zabbix监控服务端 操 ...