整理的算法模板合集: ACM模板
舒服,一次敲160行代码一次编译通过一次AC是真的爽!
虽然这道题可以当作简单版的树链剖分板子题了hhh
要求的是两条路径有没有交点,正解是LCA玄学证明,看的我有点懵,但是这道题可以用树链剖分呀,1e5的数据我们 n l o g n nlogn nlogn的树链剖分随便做。
问两条路径有没有交点,实际上我们可以直接用树链剖分直接暴力跑还不会超时,真的爽!我们只需要每次暴力将两条路径权值+1
,然后线段树维护一个最大值,看 tr[1].maxv
是不是等于2
,如果等于2
说明一定有一个点被赋值两次,所以一定是交点!(就算要找交点的id也可以直接找链接)
需要注意的是我们每次查询完一次之后要把他们再减掉,不然会对后面的答案造成影响,然后就是非常简单好写的树链剖分啦 (~ ̄▽ ̄)~
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 500007, M = 5000007, INF = 0x3f3f3f3f;
const double eps = 1e-6;
int n, m;
int root, mod;
int head[N], ver[M], nex[M], tot;
int a[N], a_after[N];
struct Tree
{
int l, r;
int lz;
int maxv;
}tr[N * 4];
int son[N];
int id[N], fa[N], cnt, deep[N], sizes[N];
int top[N];
void add(int x, int y)
{
ver[tot] = y;
nex[tot] = head[x];
head[x] = tot ++ ;
}
inline void pushup(int p){
tr[p].maxv = max(tr[p << 1]