CF1062E Company
CF1062E Company
链接
题目大意
给定一颗树,有若干个询问,每个询问给出 l,r,要求编号为 ll~rr 的点任意删去一个之后剩余点的 LCA 深度最大,输出删去点的编号和 LCA 的最大深度
思路
一堆点的lca就是dfs序列的最大和最小的lca
因为只能删除一个点,那就看看删除最大的优秀还是删除最小的优秀。
修改其他的lca是不变的。查询次大线段树麻烦,主席树还能短一点。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,q,a[N];
vector<int> G[N];
namespace seg {
struct node {
int ls,rs,siz,nb;
}e[N*30];
int cnt,rt[N];
void insert(int &rt,int old,int l,int r,int id,int nb) {
rt=++cnt;
e[rt]=e[old];
e[rt].siz++;
if(l==r) return e[rt].nb=nb,void();
int mid=(l+r)>>1;
if(id<=mid) insert(e[rt].ls,e[old].ls,l,mid,id,nb);
else insert(e[rt].rs,e[old].rs,mid+1,r,id,nb);
}
int k_th(int rt,int old,int l,int r,int k) {
if(l==r) return e[rt].nb;
int now=e[e[rt].ls].siz-e[e[old].ls].siz;
int mid=(l+r)>>1;
if(now>=k) return k_th(e[rt].ls,e[old].ls,l,mid,k);
else return k_th(e[rt].rs,e[old].rs,mid+1,r,k-now);
}
}
namespace diss_tree {
int dep[N],siz[N],fa[N];
int top[N],son[N],cnt;
void dfs1(int u,int f) {
a[u]=++cnt;
fa[u]=f;
siz[u]=1;
for(auto v:G[u]) {
if(f==v) continue;
dep[v]=dep[u]+1;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v]) son[u]=v;
}
}
void dfs2(int u,int topf) {
top[u]=topf;
if(!son[u]) return;
dfs2(son[u],topf);
for(auto v:G[u])
if(!top[v]) dfs2(v,v);
}
int lca(int x,int y) {
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y] ? x : y;
}
}
int main() {
n=read(),q=read();
for(int i=2;i<=n;++i) {
int x=read();
G[x].push_back(i);
G[i].push_back(x);
}
diss_tree::dfs1(1,0);
diss_tree::dfs2(1,1);
for(int i=1;i<=n;++i) seg::insert(seg::rt[i],seg::rt[i-1],1,n,a[i],i);
for(int i=1;i<=q;++i) {
int x=read(),y=read();
int first_max=seg::k_th(seg::rt[y],seg::rt[x-1],1,n,1);
int second_max=seg::k_th(seg::rt[y],seg::rt[x-1],1,n,2);
int first_min=seg::k_th(seg::rt[y],seg::rt[x-1],1,n,y-x+1);
int second_min=seg::k_th(seg::rt[y],seg::rt[x-1],1,n,y-x);
int tmp_x=diss_tree::dep[diss_tree::lca(first_max,second_min)];
int tmp_y=diss_tree::dep[diss_tree::lca(second_max,first_min)];
if(tmp_x > tmp_y) printf("%d %d\n",first_min,tmp_x);
else printf("%d %d\n",first_max,tmp_y);
}
return 0;
}
CF1062E Company的更多相关文章
- 题解 CF1062E Company
\(\texttt{Solution}\) 数据结构学傻的蒟蒻来写一个新思路 这题的正解是利用多个结点的 \(lca\) 是 \(dfs\) 序最大的结点和 \(dfs\) 序最小的结点的 \(lca ...
- Elasticsearch索引(company)_Centos下CURL增删改
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...
- Microsoft Dynamics AX 2012: How to get Company,Customer and Vendor address in AX 2012
Scenario: “How to get Addresses of “Customer, Vendor and Company” 1) First we need to identify ...
- poj1416 Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5379 Accepted: 3023 ...
- CodeForces 125E MST Company
E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...
- CF 321B Kefa and Company(贪心)
题目链接: 传送门 Kefa and Company time limit per test:2 second memory limit per test:256 megabytes Desc ...
- 搜索+剪枝 POJ 1416 Shredding Company
POJ 1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5231 Accep ...
- 二分+动态规划 POJ 1973 Software Company
Software Company Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1112 Accepted: 482 D ...
- 【Moqui业务逻辑翻译系列】Story of Online Retail Company 在线零售公司的故事
h1. Story of Online Retail Company 在线零售公司的故事 Someone decides to sell a product. [Product Marketer Ma ...
随机推荐
- idea右键没有svn选项
然后apply,当然也可以只是某些指定的文件夹.project就是当前项目,包括所有的module.
- Xposed免重启调试工具类
直接放代码 package com.xirtam.hello; import android.app.Application; import android.content.Context; impo ...
- Get all static wms goodlocation data
sql function and store process: create function [dbo].[fun_splitin](@c varchar(),@split varchar()) r ...
- Typescript基础
参数类型新特性: 类型声明 变量/函数:类型(string.any.number.boolean.void五种基本类型) 例如:var age:number=19; function test(na ...
- 大疆2019校招FPGA笔试总结
1.对于同步fifo,每100个cycle可以写入80个数据,每10个cycle可以读出8个数据,fifo的深度至少为? 写时钟频率 w_clk, 读时钟频率 r_clk, 写时钟周期里,每B个时钟周 ...
- python查询数据库返回数据
python查询数据库返回数据主要运用到flask框架,pymysql 和 json‘插件’ #!/usr/bin/python # -*- coding: UTF-8 -*- import pymy ...
- 《linux就该这么学》第十二节课:第10章,Apache网站服务
第十章 10.1.网站服务程序 (让用户能够通过网站访问服务器上的资源) 目前提供的网站服务有IIS,Nginx,Apache等,IIS是windows中默认的web服务程序. Nginx是后起之秀, ...
- Qt QDateEdit QDateTimeEdit
展示一个效果,然后附上一个“笑话~~”...回想起来都是搞笑的. 笑话来了,,,,几个月前,为了做出时间选择界面,我亲自“创造”了一个...今天发现了QDateEdit的属性CalendarPopup ...
- 基于Nginx 和 uwsgi 搭建 django.
第一篇博客,不是很懂语法之类的,希望通过多写点东西,记录自己的成长,早点成为一个pyer. 就写下这两天折腾的这个nginx-uwsgi-django. 首先附上官方文档链接 http://uwsgi ...
- vs2017 git凭证问题
安装完tfs2017(自带git)后,连接git代码服务器,报authorication错误.这是vs2017的bug.尝试了许多种方案后,最简单的干脆手动添加如下3个凭证.一定要核对好地址中的. ...