摘要:
DFS找到节点删除的时间,删除的时间其实就是子树的最长链,然后给每个点打一个时间戳,然后求每个时间点对应删除的节点的个数,对于1-max_time时间戳求一个前缀和,然后二分找到和m距离最近的那一天 阅读全文
摘要:
直接点权下放到边权,每次查询从dfs序的st[u]+1,ed[v]之间查询, 阅读全文
摘要:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; const int maxx = 2e5+6; struct node{ int rt,l,r,val,pos,dis; node(){ l=r=val=dis=pos=0; } }tree[maxx]; 阅读全文
摘要:
这道题还是非常简单的,由于我们要保证最小字典序,因此我们需要把边进行排序,然后从大到小插入,因为链式前向星是倒着存的。我们只需要先跑一个最短路,然后查询边是不是在最短路上,这个可以通过枚举边并用 dist[v]=dist[u]+edge[i]判断即可,如果是的话我们在这个边上打上标记。并进行一次DF 阅读全文
摘要:
这道题非常巧妙!!! 我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是 当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点,所有绿色的子树节点的到当绿色的点权乘积 有如下的情况: 1*5*7 3*6*7 2*5*7 4*6*7 然后我们要想 阅读全文
摘要:
直接进行树链剖分,每次对路径区间内的所有点值+1,线段树进行维护,然后查询线段树的最大值的个数!!! 查询线段树区间最大值个数,可以先维护区间和,在维护区间最值,如果区间和等于区间最值乘以区间长度,那么直接返回长度!!! 清空的时候,直接减去,不要直接重新建树 阅读全文
摘要:
这道题是求等于k的,和求<=k的基本上是如出一辙,需要注意的是,我们在把子树距离排序以后,在寻找距离等于K的数目的时候,也是用两个指针,进行扫描,如果蛮子满足q[l]+q[r]==k,我们需要检查是不是这两个q[l]和q[r]是同一个值,如果是的话,我们其实就是在l 到 r中选取两个,用一下组合公式 阅读全文
摘要:
#include #include #include #include #define N 40005 #define M 80005 #define LL long long using namespace std; const int INF = 0x3f3f3f3f; int ver[M],edge[M],head[N],Next[M]; int n,m,tot,root;LL... 阅读全文
摘要:
枚举每一个连续的K的第一个位置,如果是先手胜利,那么前[1 , i-1 ]和[ i+k , n ]区间要么全是0,要么全是1 如果能够平局,那么肯定是[1,i-1],以及[ i+k , n]中有两种情况 有一个区间全为0,并且另外有个区间内部最左边的1和最右边的1距离是大于K 有一个区间全为1,并且 阅读全文
摘要:
这个题其实也是很简单的莫队,题目要求是给一个序列,询问l-r区间内部,找到有多少对答案满足 i < j 并且 | a[ i ] -a[ j ] | <=k 也就是有多少对,满足差值小于k的个数。 把这个式子展开,其实就是-k<= a[ i ] -a [ j ] <= k 也就是 a[ j ] -k 阅读全文