【luogu P4114 Qtree1】 题解】的更多相关文章

题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x]+1 到 seg[y],因为seg[x]其实连接的是上面一条边的边权. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long…
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例: 输出样例: 说明 说明 思路 Change Query AC代码 总结 题面 题目链接 P4114 Qtree1 题目描述 给定一棵 $ n $个节点的树,有两个操作: CHANGE $ i $ $ t_i $ 把第 $ i $条边的边权变成 $ t_i $ QUERY $ a $ $ b $ 输出从 $ a $ 到 $ b $ 的路径中最大的边权,当 $ a=b $ 的时候,输出 0 输入输出格式…
https://www.luogu.org/problem/P4114 维护边权的话,用深度大的点表示这条边(可以遍历一边边询问两端深度,这样不需要修改dfs1,也可以在dfs1的时候向下走的同时把边权拷贝进深度大的点.),然后在链上问的时候,最后一次问的左端点要+1(小心左右端点原本重合). 要注意每个点x实际上在线段树上的位置是tid[x],不要改错了.线段树build的时候初始化的不是a[x]而是a[rnk[x]],也就是x号线段树位置对应的dfn序,也就是节点本身(rnk和tid互为逆运…
题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn = 5 * 1e6 + 10; ll n, m, s, t, g, q; ll dis[maxn], h[maxn], l[maxn]; bool vis[maxn]; struct e…
题目描述 给定一棵\(n\)个节点的树,有两个操作: \(CHANGE\) \(i\) \(t_i\) 把第\(i\)条边的边权变成\(t_i\) \(QUERY\) \(a\) \(b\) 输出从\(a\)到\(b\)的路径中最大的边权,当\(a=b\)的时候,输出\(0\) 输入输出格式 输入格式: 第一行输入一个\(n\),表示节点个数 第二行到第\(n\)行每行输入三个数,\(u_i\),\(v_i\),\(w_i\),分别表示 \(u_i\),\(v_i\)有一条边,边权是\(w_i\…
其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法,如果你无法将他卡到错误,那么他就是对的 所以,就产生了下面的科学随机写法 随机化顺序,模拟过程,取ans最小值 code #include<bits/stdc++.h> using namespace std; const int MAXN=20; void file(string s){freo…
题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了……) 点分治的总结先鸽着,这里只说题解. 分析一下题目: 对于无根树上的某一节点x,如果把它看作根,树上的路径无非两类: 1.经过x. 2.不经过x,但在它的子树里. 显然,后者利用点分治的思想经过递归处理可以转化为前者,那么我们就只需考虑第一类, 这也是点分治的强大之处. 我们设$dis[]$为节…
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以扫一遍,然后就搞定了. 然后还有一个小点,要把每个区间搞成左闭右开,否则碰到诸如 (3,7,5)和(5,8,9) 这样的数据,中间的空隙就不会被计算. 然后写个线段树维护一下就ok了 代码 #include <bits/stdc++.h> using namespace std; const in…
题目传送门 [题目大意] 给定一个n×n的点方阵,求站在左下角的点能看到的点数 注意同一条直线上只能看到一个点 [思路分析] 因为是一个方阵,所以可以对称地算,那么对于半个方阵,这里假设是左上的半个方阵,能看到的点的个数要满足这样的条件 1.x<y 因为是左上的半个方阵,并且x=y的一直线上的点要额外计算 2.gcd(x,y)即x与y互质 这是为了保证一直线上只能看到一个点 容易发现,在满足条件的情况下,这样的x个数恰好等于φ(y) 还需要注意的一点是,最左边一列,最下面一行,还有x=y这条直线…
思路 树剖一发,注意对LCA的处理 代码 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 100100; int dfs_clock,dep[MAXN*2],heason[MAXN*2],id[MAXN*2],sz[MAXN*2],top[MAXN*2],fa[MAXN*2],w_p[MAXN*2],v[MAXN*2],fir[…