
树
文章平均质量分 50
赤兔码
我服了
展开
-
E.Trees of Tranquillity
E. Trees of Tranquillity题意:多组输入,给两个都是n个节点的树A和树B然后给一个n个节点的图,然后如果两个点x和y同时满足以下两个条件则连边,1.在树A中x是y的祖先或者y是x的祖先,2,在树B中x和y谁也不是谁的祖先求图的最大团的大小n<=3e5输入的树边为a2到an,ai代表i的父亲是ai,1<=ai<i思路:A树上的肯定在一条链上,B树则为dfs序的不重叠区间这个题的巧妙之处在于输入ai<i这个限制,这样一条链上的各个点标号一定是递增原创 2021-05-25 23:42:53 · 484 阅读 · 0 评论 -
斯坦纳树
斯坦纳树:给n个点m条边的无向图,然后给出k个点的集合,找一个最小的生成树使得包含这k个点(这个生成树必须包含这k个点,其他点可以有也可以没有,但是必须保证最后是个生成树,然后找最小的生成树)。利用状压加最短路算法实现,目前没有多项式时间复杂度的算法。dis[x][p]代表以x为根,k个点集合中选择了状态为p的点的最小生成树权值。两个核心转移方程 dis[x][p]=min(dis[x][p],dis[x][i]+dis[x][p^i]);和 dis[x][p]=min(dis[x][p],dis原创 2021-01-16 23:03:35 · 552 阅读 · 0 评论 -
牛客练习赛71 E 神奇的迷宫(点分治+NTT)
E 神奇的迷宫思路:点分治+NTT裸题,NTT初始化很重要!!!NTT中limit,L,a数组和b数组都得初始化。这个题中点分治的sum和主函数中的sum求和弄混了因此一直T,心态崩了。#include<iostream>//注意此模板点的下标应为1到n!!!#include<cstdio>#include<vector>using namespace std;const int MAX_N=600100;const int G=3;const in原创 2020-10-16 17:44:58 · 246 阅读 · 0 评论 -
Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) D. Campus(Kruskal重构树 两个线段树加两个Kruskal重构树)
D. Campus题意:思路:两个线段树加 Kruskal乱搞,第一个单秒的3100分的题,无敌,这题稍微卡内存,线段树只能开三个变量。总的来说,这个题恶心人。250行,真恶心。#include<iostream>#include<cstdio>#include<vector>using namespace std;const int MAX_N=1001000;struct skt{ char s[2]; int x,y;}qy[.原创 2020-10-14 23:16:16 · 374 阅读 · 1 评论 -
2020牛客第七场 C题 A National Pandemic(树链剖分+小技巧)
C题 A National Pandemic题意:一棵树,n个点,m个操作,操作有三种。操作1,给出x和w,将所有的点y的权值加上w-dis(x,y)。操作2,给出x,将x与0取min。操作3,给出x,求x的权值。n,m<=40000.思路:难点就是操作1。w-dis(x,y)=w-dis(1,x)-dis(1,y)+2 * dis(1,lca(x,y));dis(1,lca(x,y))的处理是难点,其余直接弄一个变量计数即可。问题化为:给出x点,对于每个点y的权值加上dis(1,l原创 2020-08-03 21:03:39 · 412 阅读 · 0 评论 -
BFS树
BFS树就是通过bfs遍历一个图构成出来的树,特点就是在无权图上的非树边连接的两点一定在同一层(即深度相同)或者相邻的两层(即深度差的绝对值为1)。原理:首先bfs树中每个点的深度就是这个点到树根的最短距离,这个想成权值为1的dijkstra就很容易理解,然后如果两个点隔了三层,而他们直接的边的权值为1,那么其中一个深度小的点就可以优化另一个深度大的点,所以这两个点深度绝对值最大为1.H. Heat Pipes这个题就是将所有的点的权值赋值为[a,b]中的一个数,使得任意一条边连着的两个点的权值的绝对原创 2020-05-27 23:22:58 · 1688 阅读 · 0 评论 -
Kruskal重构树
Kruskal重构树就是一个图利用最小生成树算法建树,但是建树代码如下 int tot=n; for(i=1;i<=m;i++){ int fx=find(edge[i].x); int fy=find(edge[i].y); if(fx!=fy){ pre[fx]=pre[fy]=++tot; kv[tot].push_back(fx); kv[tot]....原创 2020-04-29 21:10:33 · 444 阅读 · 0 评论 -
虚树
虚树,选择k个点,构成一个树,这个树只包含所选点和他们两两之间的lca,特点为这个虚树上的点不超过2*k个,若有多组k,则复杂度为2 * ∑ k。模板:int tp,st[MAX_N];vector<int>sv[MAX_N];//存放虚树,用完后clear,复杂度为2*kint dep[MAX_N];//为树的深度 void build(int s,int count){...原创 2020-04-22 00:06:30 · 264 阅读 · 0 评论 -
ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang
ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang题意:两个操作,1操作将深度为x的所有点加权值k,2操作询问x的子树的权值和。q<=1e5,n<=1e5。思路:可以考虑两种思路,第一种用树状数组维护每个dfs序对应点的权值,当操作1输入x,k时则把深度为x的所有点的所对应dfs序再在树状数组中都加k,然后查询子树x的权值和时即ask(out[x])-ask(...原创 2020-01-12 22:43:32 · 258 阅读 · 0 评论