题解 CF1062E Company
\(\texttt{Solution}\)
数据结构学傻的蒟蒻来写一个新思路
这题的正解是利用多个结点的 \(lca\) 是 \(dfs\) 序最大的结点和 \(dfs\) 序最小的结点的 \(lca\)。但是这里考虑如何不用这种方法。
首先用线段树合并处理出在每一个结点的子树里面的点。
答案分为两种情况:
1. 包含结点 \(l\)。
那么我们可以以 \(l\) 为起点向上跳。找到第一个大小 \(\ge r - l\) 的结点 \(p\)。然后在结点 \(p\) 上面二分找到是没有选哪个结点。
2. 包含除了结点 \(l\) 外的所有结点。
那么我们可以以 \(l\) 为起点向上跳。找到第一个大小 \(\ge r - l\) 的结点 \(p\)。这样子的答案就是 \(l\)。
\(\texttt{Code}\)
#include<bits/stdc++.h>
using namespace std;
#define L(i, j, k) for(int i = (j), i##E = (k); i <= i##E; i++)
#define R(i, j, k) for(int i = (j), i##E = (k); i >= i##E; i--)
#define ll long long
#define db double
#define mkp make_pair
const int N = 2e5 + 7;
const int M = 8e6 + 7;
int n, m, fa[N], siz[N], dep[N], jp[20][N];
int head[N], edge_id;
int hd[N], sum[M], ch[M][2], tot;
struct node { int to, next; } e[N << 1];
void add_edge(int u, int v) { ++edge_id, e[edge_id].next = head[u], e[edge_id].to = v, head[u] = edge_id; }
void add(int &x, int L, int R, int wz) {
if(!x) x = ++tot;
sum[x]++;
if(L == R) return;
int mid = (L + R) / 2;
if(wz <= mid) add(ch[x][0], L, mid, wz);
else add(ch[x][1], mid + 1, R, wz);
}
int merge(int x, int y) {
if(!x || !y) return x | y;
int nw = ++tot;
sum[nw] = sum[x] + sum[y];
ch[nw][0] = merge(ch[x][0], ch[y][0]);
ch[nw][1] = merge(ch[x][1], ch[y][1]);
return nw;
}
int query(int x, int L, int R, int l, int r) {
if(!x) return 0;
if(l <= L && R <= r) return sum[x];
int mid = (L + R) / 2, res = 0;
if(l <= mid) res += query(ch[x][0], L, mid, l, r);
if(r > mid) res += query(ch[x][1], mid + 1, R, l, r);
return res;
}
void dfs(int x) {
siz[x] = 1, add(hd[x], 1, n, x);
for(int i = head[x]; i; i = e[i].next) {
int v = e[i].to;
dep[v] = dep[x] + 1, dfs(v), siz[x] += siz[v];
// cout << " ? \n";
hd[x] = merge(hd[x], hd[v]);
// cout << " ! \n";
}
}
int get(int x, int l, int r, int y) {
int nowans = query(hd[x], 1, n, l, r);
if(nowans > y) return 0;
if(nowans == y) return x;
int now = x;
R(i, 18, 0) if(jp[i][now] && query(hd[jp[i][now]], 1, n, l, r) < y) now = jp[i][now];
now = fa[now];
if(query(hd[now], 1, n, l, r) != y) return 0;
return now;
}
int main() {
scanf("%d%d", &n, &m);
L(i, 2, n) scanf("%d", &fa[i]), add_edge(fa[i], i), jp[0][i] = fa[i];
L(i, 1, 18) L(j, 1, n) jp[i][j] = jp[i - 1][jp[i - 1][j]];
dfs(1);
while(m--) {
int l, r;
scanf("%d%d", &l, &r);
int resa = get(l + 1, l + 1, r, r - l), resb = get(l, l, r, r - l);
// 1 : not contain l
if(dep[resa] >= dep[resb]) printf("%d %d\n", l, dep[resa]);
// 2 : contain l
else {
int L = l, R = r;
while(L < R) {
int mid = (L + R) / 2;
if(query(hd[resb], 1, n, L, mid) != mid - L + 1) R = mid;
else L = mid + 1;
}
printf("%d %d\n", L, dep[resb]);
}
}
return 0;
}
题解 CF1062E Company的更多相关文章
- CF1062E Company
CF1062E Company 链接 cf luogu 题目大意 给定一颗树,有若干个询问,每个询问给出 l,r,要求编号为 ll~rr 的点任意删去一个之后剩余点的 LCA 深度最大,输出删去点的编 ...
- poj1416 Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5379 Accepted: 3023 ...
- Codeforces 556D Restructuring Company
传送门 D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes input ...
- VK Cup 2015 - Finals, online mirror D. Restructuring Company 并查集
D. Restructuring Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
- Codeforces Round #321 (Div. 2) B. Kefa and Company 二分
B. Kefa and Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/pr ...
- Codeforces 1090A - Company Merging - [签到水题][2018-2019 Russia Open High School Programming Contest Problem A]
题目链接:https://codeforces.com/contest/1090/problem/A A conglomerate consists of n companies. To make m ...
- 【CF125E】MST Company(凸优化,最小生成树)
[CF125E]MST Company(凸优化,最小生成树) 题面 洛谷 CF 题解 第一眼看见就给人丽洁姐那道\(tree\)一样的感觉. 那么二分一个权值,加给所有有一个端点是\(1\)的边, 然 ...
- HDU-3974 Assign the task题解报告【dfs序+线段树】
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- 【CodeForces】790 C. Bear and Company 动态规划
[题目]C. Bear and Company [题意]给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串.n<=75. [算法]动态规划 [题解 ...
随机推荐
- tcp输入数据 慢速路径处理 && oob数据 接收 && 数据接收 tcp_data_queue
大致的处理过程 TCP的接收流程:在tcp_v4_do_rcv中的相关处理(网卡收到报文触发)中,会首先通过tcp_check_urg设置tcp_sock的urg_data为TCP_URG_NOTYE ...
- Flink Native Kubernetes实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 《.NET 5.0 背锅案》第7集-大结局:捉拿真凶 StackExchange.Redis.Extensions 归案
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- 不要再说不会Spring了!Spring第一天,学会进大厂!
工作及面试的过程中,作为Java开发,Spring环绕在我们的身边,很多人都是一知半解,本次将用14天时间,针对容器中注解.组件.源码进行解读,AOP概念进行全方面360°无死角介绍,SpringMV ...
- LeetCode 中等题解(1)
16 最接近的三数之和 Question 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和. ...
- SpringSecurity之授权
SpringSecurity之授权 目录 SpringSecurity之授权 1. 写在前面的话 2. web授权 1. 建库 2. 添加查询权限的接口 3. 前端页面的编写 4. SpringSec ...
- 面试腾讯,字节跳动,华为90%会被问到的HashMap!你会了吗?
简介 HashMap是平常使用的非常多的,内部结构是 数组+链表/红黑树 构成,很多时候都是多种数据结构组合. 我们先看一下HashMap的基本操作: new HashMap(n); 第一个知识点 ...
- 使用FL Studio来制作停顿的效果
停顿效果是一种在音乐创作中非常常用的音效,它能起到缓冲的作用,而且能使这段旋律更具节奏感,在比较激情的歌曲中尤为常见.例如知名歌手王力宏演唱的<火力全开>中就使用了停顿效果,为歌曲加了不少 ...
- 怎么用Camtasia给视频添加片头片尾
有许多朋友现在喜欢自己拍摄一些小视频,现在不管是在抖音还是在B站,我们看到的大部分视频都有UP主自己制作的片头或片尾.片头做的好,甚至会有人因为片头而关注UP主,能吸引更多的人来观看视频. 所以,如果 ...
- Vegas技巧分享,如何实现5.1立体声道
Vegas Pro 15除了有各种好用的功能之外,还可以使用此软件制作5.1立体声道的音乐.如果你家里有多个音箱,那么你再也不用担心找不到5.1声道的音乐了,Vegas完全可以帮你实现. 打开简体中文 ...