牛客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\)个 ...
随机推荐
- POJ1045 Bode Plot
题目来源:http://poj.org/problem?id=1045 题目大意: 如图所示的交流电路,假设电路处于稳定状态,Vs为电源电压,w是频率,单位为弧度每秒,t表示时间. 则:V1 = Vs ...
- kvm磁盘io优化以及性能测试以及与物理机对比
ubuntu下kvm的磁盘io性能优化步骤 1.virsh shutdown wcltest2 2.virsh edit wcltest2 <driver name='qemu' type='q ...
- Unity 动画系统目录
引言 提到动画,你想到的是什么? 图片在循环播放构成的动画.UI物体的循环变色.2D 3D物体在循环运动.链条弹簧的运动.3D的玩家在行走奔跑挥剑.非人形的运动... 动画实现方式的分类 动画实现的方 ...
- Migration-添加表
public partial class _111111 : DbMigration { public override void Up() { CreateTable( "dbo.Asse ...
- Luogu P2973 [USACO10HOL]赶小猪Driving Out the Piggi 后效性DP
有后效性的DP:$f[u]$表示到$u$的期望次数,$f[u]=\Sigma_{(u,v)} (1-\frac{p}{q})*f[v]*deg[v]$,最后答案就是$f[u]*p/q$ 刚开始$f[1 ...
- Excel打印区域设置
excel打印区域设置 在打印excel的时候,经常需要来设定打印区域,才能更好的打印我们所要的东西,那怎么设置了,这里做个记录,以备使用查看 1.首先选中你要打印的区域,拖动鼠标框选就可以.如图 选 ...
- WPF使用Aspose.Words导出Word文档
一.创建Word文档模板 分析需要导出的word文档,将固定的内容和由程序生成的内容分开; 创建一个word(例如:Template.doc)文档,将固定的内容按照一定的格式写入当前文档中; 打开Te ...
- springmvc之Hello World及常用注解
步骤: 加入jar包 在web.xml 中配置DispacherServlet 加入SpringMVC 配置文件springmvc.xml 编写请求处理器(action/controller) 编写视 ...
- 【Java】Maven 常用命令
Maven 常用命令 mvn compile 编译,生成target文件夹,里边有classes文件夹,存放.class文件 mvn test 执行测试 mvn package 打包,在targert ...
- 微信小程序:从本地相册选择图片或使用相机拍照。
wx.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照. OBJECT参数说明: 示例代码: wx.chooseImage({ count: 1, // 默认9 sizeTyp ...