Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str(),"r",stdin); freopen(out.c_str(),"w"…
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空间你懂得),但是需要离线,因为共用节点的缘故,之后的修改可能会修改到不需要修改的节点(好绕啊): 这题就是把向上向下的贡献分开算,然后移一下项发现只与深度有关 可以直接二维数点,也可以线段树合并 #include<bits/stdc++.h> using namespace std; const…
题面 传送门:https://www.luogu.org/problemnew/show/P3899 Solution 你们搞的这道题啊,excited! 这题真的很有意思. 首先,我们可以先理解一下题面:固定一个a,找到一个b,c就是a与b的公共子树中的某个点. 那么,我们显然可以把这个b分成两类,第一种是在a上面的,第二种在a下面的. 对于b在a上面的情况,显然,c一定是a的子树中的某个点,答案即为min(K,depth[a])*size[a] 对于b在a下面的情况,问题就会变得比较exci…
题面:P3899 [湖南集训]谈笑风生 题解: 我很喜欢这道题. 因为A是给定的,所以实质是求二元组的个数.我们以A(即给定的P)作为基点寻找答案,那么情况分两类.一种是B为A的父亲,另一种是A为B的父亲. 第一种情况很好处理,写法见代码,懒得讲,反正很简单的. 第二种情况的话,按Dfs序建主席树,用主席树维护下标为Dep的序列,每次用Size-1(因为不能取本身:Size[i]即为以i为根的子树节点数)去更新, 询问的时候在以A为根的子树中查找Dep[A]+1~Dep[A]+K的和即可. 不思…
传送门 nmyzd,mgdhls,bnmbzdgdnlql,a,wgttxfs 对于一个点\(a\),点\(b\)只有可能是他的祖先或者在\(a\)子树里 如果点\(b\)是\(a\)祖先,那么答案为a子树大小\(sz_a-1\) 否则,答案为\(sz_b-1\) 加上\(k\)的限制后,如果根节点1的深度\(de_1=1\)那么节点\(a\)的答案就是\(\sum_{b在a子树中,b\ne a,dist(a,b)\leq k}\ \ (sz_b-1)+\min(k,de_a-1)*(sz_a-…
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<math.h> #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define LL long long using namespace std; ;…
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P3899 思路 三个点肯定在1到c的链上 a已经确定 1.b是a的祖先,答案就是(siz[u]-1)*min(dis[u]-1,k) 2.a是b的祖先,要求\(1<=dis[b]-dis[a]<=k\) \(1+dis[a]<=dis[b]<=k+dis[a]\) 第一问可以快速求出 第二…
题目链接 神奇的线段树合并qwq   不过就思路而言很好想…… 观察到一棵树无论怎么交换两棵左右子树,子树内部的最优逆序对并没影响……决策只影响左右子树之间的逆序对…… 于是线段树合并直接乱搞就好啦 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #define mid ((l+r)>>1) #defin…
LINK:情报中心 神题! 写了一下午 写到肚子疼. 调了一晚上 调到ex 用的是网上dalao的方法 跑的挺快的. 对于链的暴力 我不太会kk. 直接说正解吧: 分类讨论两种情况: 1 答案的两条链的LCA不重合. 2 答案的两条链的LCA重合了. 会造成这两种讨论是因为我们无法确定如果LCA重合了 固定那条重合的链 另外一个方向上的那两条链是否重合了. 其他blog里有配图 我就不放了直接口胡. 前者维护一下两条链第一次重合的地方. 然后使用线段树合并的时候来统计答案. 这个地方要注意细节的…
LINK:地图 考虑如果是一棵树怎么做 权值可以离散 那么可以直接利用dsu on tree+树状数组解决. 当然 也可以使用莫队 不过前缀和比较难以维护 外面套个树状数组又带了个log 套分块然后就可以了. 最暴力的当然是线段树合并了. 此时考虑这是个仙人掌 仔细画图 发现一些比较好的性质 某个点x 除了自己某个儿子的low比自己的dfn小 剩下的都大. 剩下的显然都可以造成贡献 利用dfn和low可以轻松判断 然后上线段树合并即可. 省空间的话可以直接离线 当然也可以在线做. 不过这个做法不…