会爆栈,dfs传参,只能传1个~~RMQLCA在线

#include<cstdio>
#include<cstring>
#include<algorithm>
#pragma comment(linker, "/STACK:1024000000, 1024000000")
#include<queue>
using namespace std;

const int M = 400015;
struct Edge{
    int v, next;
} edge[M << 1];
int cnt;
int F[M<<1], rmq[M << 1], P[M];
int dp[20][M<<1];
int E; int head[M];
void add_edge(int s, int v){
    edge[E].next = head[s];
    edge[E].v = v;
    head[s] = E ++;
}

int vis[M];
int dep[M];
void dfs(int u){
    cnt ++;
    F[cnt] = u;
    rmq[cnt] = dep[u];
    P[u] = cnt;
    vis[u] = 1;
    for(int i = head[u]; i != -1; i = edge[i].next){
        int v = edge[i].v;
        if(vis[v]) continue;
        dfs(v);
        cnt ++;
        rmq[cnt] = dep[u];
        F[cnt] = u;
    }
}

void RMQ(int n){
    for(int i = 1; i <= n; i ++) dp[0][i] = i;
    for(int j = 1; (1<<j) <= n; j ++) {
        int tmp = 1<<(j-1);
        for(int i = 1; i + tmp <= n; i ++){
            dp[j][i] = (rmq[dp[j-1][i]] < rmq[dp[j-1][i + tmp]])?dp[j-1][i]:dp[j-1][i + tmp];
        }
    }
}

int query(int L, int R){
    if(L > R) swap(L, R);
    int t = R - L+1;
    int k = 0;
    while(t >= (1<<(k+1))) k ++;
    return rmq[dp[k][L]] < rmq[dp[k][R-(1<<k) + 1]]?dp[k][L]:dp[k][R-(1<<k) + 1];
}
int solve(int a, int b){
    return F[query(P[a], P[b])];
}
int dis[M], vv[M];
void bfs(){
    queue<int> q;
    q.push(1);
    vv[1] = 1;
    dep[1] = 1;
    while(!q.empty()){
        int u = q.front(); q.pop();
        for(int i = head[u]; i != -1; i = edge[i].next){
            int v = edge[i].v;
            if(vv[v]) continue;
            dep[v] = dep[u] + 1;
            vv[v] = 1;
            q.push(v);
        }
    }
}
int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    int a, b;
    memset(head, -1, sizeof(head));
    for(int i = 2; i <= n; i ++){
        scanf("%d", &a);
        add_edge(a, i);
        add_edge(i, a);
    }
    cnt = 0;
    bfs();
    dfs(1);
    RMQ(2*n);
    while(m --){
        scanf("%d%d", &a, &b);
        int lc = solve(a, b);
        if(lc == a)
            printf("%d %d\n", rmq[P[lc]], rmq[P[b]] - rmq[P[lc]]);
        else if(lc == b){
            printf("%d %d\n", rmq[P[a]] - rmq[P[lc]], rmq[P[lc]]);
        }else {
            printf("%d %d\n", rmq[P[a]], rmq[P[b]] - rmq[P[lc]]);
        }
    }
    return 0;
}
/*
6 1
4 1 1 3 3
5 6
*/

  

时间: 2024-11-06 16:18:37

会爆栈,dfs传参,只能传1个~~RMQLCA在线的相关文章

Go语言的传参和传引用[转]

目录[-] 传参和传引用的问题 传slice不是传引用! 什么叫传引用? 为什么传slice不是传引用? 为什么很多人误以为slice是传引用呢? 传指针和传引用是等价的吗? 所有类型的函数参数都是传值的! 那Go语言有传引用的说法吗? 什么是引用类型, 和指针有何区别/联系 ? 总结 传参和传引用的问题 很多非官方的文档和教材(包括一些已经出版的图书), 对Go语言的传参和引用的讲解 都有很多问题. 导致众多Go语言新手对Go的函数参数传参有很多误解. 而传参和传引用是编程语言的根本问题, 如

cocos2dx 菜单按钮回调方法传参 tag传参

.h文件 void menuCallBack(CCObject* pSender); .cpp CCMenuItemSprite* item = CCMenuItemSprite::create( menuCB1, menuCB2, this, menu_selector(helloworld::menuCallBack)); item->setTag(m); 回调方法 void helloworld::menuCallBack(CCObject* pSender) { CCNode* node

重构小结——从传参到传实体,从datatable到泛型

在介绍这些内容之前,我们首先来了解什么是面向对象,面向对象的核心是什么? 一.面向对象的简单介绍 起初,"面向对象"是专指在程序设计中采用封装.继承.多态等设计方法.但,后来面向对象的思想设计到了各个方面.一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类.继承,帮助人们实现对现实世界的抽象与数字建模.通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析.设计与编程. 所以我们可以简单的将面向对象的核心概况为对象,也可以说是类. 二.实体的简

Vue路由传参及传参后刷新导致参数消失处理

参考:https://blog.csdn.net/qq_43103581/article/details/82260073(vue 路由传递参数,刷新页面后参数丢失) 项目功能需要,要从列表页跳转到第三方提供的URL上(这里第三方页面我是通过iframe引入在详情页,目的是点击返回时可以通过keepAlive让列表页不刷新,如果不通过iframe直接跳第三方链接,那么返回必然会重新拉取数据),一路百度,刚开始使用 this.$router.push({name:'list', params:{i

传参-子传父

效果: const App = props => { let alerts = () => { props.alertSs(props.time) } let is = {color:props.color? "red" : "blue"} return <div onClick={alerts} style={is}>{props.time},</div>; } let Apps = ()=>{ let alertSs =

Postman 串行传参和动态传参详解

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用的接口是微信公众号开发文档里面的接口,详细请看开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 首先需要获取到接口测试号,开始开发>接口测试号申请>获得appID和appsecret,位置为:htt

React路由安装使用和多种方式传参

安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from "react-router-dom" 整个项目顶层需要用<Router>包裹 并且 <Router>组件内只能有一个直接子级元素 例如: let App = props => (<Router> <div> <Route path=&quo

子组件以及父子组件之间的传参

子组件 栗子: 需要注意的点都在代码中注释标出来了 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title></title> <style> .wrap { width: calc(200px * 4 + 80px); margin: 0 auto; user-select: none; } .box

vue-router路由传参之query和params

首先简单来说明一下$router和$route的区别 //$router : 是路由操作对象,只写对象 //$route : 路由信息对象,只读对象 //操作 路由跳转 this.$router.push({ name:'hello', params:{ name:'word', age:'11' } }) //读取 路由参数接收 this.name = this.$route.params.name; this.age = this.$route.params.age; 1·query传递参数

438 vuex:基本使用,传参,vue和vuex的配合使用,Vue脚手架3,使用Vuex改版 TodoMVC,actions,mapGetters,mapMutations,mapActions

一 .Vuex的介绍 vuex 是什么? 状态管理工具 状态:即数据, 状态管理就是管理组件中的data数据 Vuex 中的状态管理工具, 采用了 集中式 方式统一管理项目中组件之间需要通讯的数据 [共享的数据.] [看图] 如何使用 最佳实践 : 只将组件之间共享的数据放在 vuex 中, 而不是将所有的数据都放在 vuex 中 也就是说: 如果数据只是在组件内部使用的, 这个数据应该放在组件中, 而不要放在 vuex vuex 中的数据也是 响应式 的, 也就是说: 如果一个组件中修改了 v