给定有n个结点的树和长度为n的排列,q次询问:l, r, x, 若p[l, r]中存在至少一个结点是x的后代,输出yes,否则输出no

2023-12-12 20:15

本文主要是介绍给定有n个结点的树和长度为n的排列,q次询问:l, r, x, 若p[l, r]中存在至少一个结点是x的后代,输出yes,否则输出no,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int n, q;
vector<int> G[maxn];
int L[maxn], R[maxn];//L[i]表示结点i的时间戳,R[i]表示结点i的后代中时间戳的最大值
int p[maxn];
int t[maxn];
struct Node{int id, flag, x;//id:第几次询问,flag:0为左端点,1为右端点,x:询问结点
};
vector<Node> Q[maxn];//Q[i]存询问区间左端点-1为i或右端点为i的询问
int tot;
int ans[maxn][2];//ans[i][0]:第i次询问,设询问区间为[l, r], 询问结点为x,只考虑p[1, l - 1], 有多少个结点的时间戳在[L[x], R[x]]范围内, ans[i][1]:考虑p[1, r],有多少个结点时间戳在[L[x], R[x]]内
void dfs(int u, int fa){L[u] = ++tot;for(auto v : G[u]){if(v == fa) continue;dfs(v, u);}R[u] = tot;
}
int lowbit(int x){return x & (-x);
}
void add(int x, int k){for(int i = x; i <= n; i += lowbit(i)){t[i] += k;}
}
int ask(int x){int res = 0;for(int i = x; i >= 1; i -= lowbit(i)){res += t[i];}return res;
}
void init(){for(int i = 1; i <= n; i++){G[i].clear();t[i] = 0;}tot = 0;for(int i = 1; i <= q; i++){Q[i].clear();ans[i][0] = ans[i][1] = 0;}
}
void solve(){//int n, q;cin >> n >> q;init();for(int i = 1; i < n; i++){int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}for(int i = 1; i <= n; i++){cin >> p[i];}for(int i = 1; i <= q; i++){int l, r, x;cin >> l >> r >> x;l--;//!!!!Q[l].push_back({i, 0, x});Q[r].push_back({i, 1, x});}dfs(1, 0);for(int i = 1; i <= n; i++){// for(auto [id, flag, x] : Q[i]){// 	if(flag == 1) continue;// 	ans[id][flag] = ask(R[x]) - ask(L[x] - 1);// }int u = p[i];int pos = L[u];add(pos, 1);for(auto [id, flag, x] : Q[i]){//if(flag == 0) continue;ans[id][flag] = ask(R[x]) - ask(L[x] - 1);}}for(int i = 1; i <= q; i++){if(ans[i][0] == ans[i][1]) cout << "No\n";else cout << "Yes\n";}cout << '\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(0);int T;cin >> T;while(T--){solve();}// map<int, int> mp;// mp[1] = 1;// mp[2] = 2;// for(auto [x, y] : mp){// 	cout << x << ' ' << y;// }return 0;
}

这篇关于给定有n个结点的树和长度为n的排列,q次询问:l, r, x, 若p[l, r]中存在至少一个结点是x的后代,输出yes,否则输出no的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485802

相关文章

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

LibSVM学习(五)——分界线的输出

对于学习SVM人来说,要判断SVM效果,以图形的方式输出的分解线是最直观的。LibSVM自带了一个可视化的程序svm-toy,用来输出类之间的分界线。他是先把样本文件载入,然后进行训练,通过对每个像素点的坐标进行判断,看属于哪一类,就附上那类的颜色,从而使类与类之间形成分割线。我们这一节不讨论svm-toy怎么使用,因为这个是“傻瓜”式的,没什么好讨论的。这一节我们主要探讨怎么结合训练结果文件