[洛谷P3304] [SDOI2013]直径】的更多相关文章

洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节点之间最多有一条简单路径.我们用 dis(a,b)表示点a和点b的路径上各边长度之和.称dis(a,b)为a.b两个节点间的距离. 直径:一棵树上,最长的路径为树的直径.树的直径可能不是唯一的. 现在小Q想知道,对于给定的一棵树,其直径的长度是多少,以及有…
题面 Bzoj 洛谷 题解 (除了代码均摘自喻队的博客,可是他退役了) 首先固定一棵树,枚举另一棵树,显然另一棵树只有与这棵树同构才有可能产生贡献 如果固定的树以重心为根,那么另一棵树最多就只有重心为根才有可能同构了(可能有两个) 然后就是求改动次数最小值,设$f[x][y]$表示以第一棵树$x$为根的子树内和第二棵树内$y$为根的子树内,达到目标最少需要改动的次数 我们发现只有同构的子树需要决策,我们把同构的子树分别拿出来,我们要做的就是做一个匹配,跑一遍$KM$或者费用流就好了.因为要最小化…
题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种各样的小bug,至少有七八个... 思路:先随便找一条直径,然后从一个端点开始遍历这条直径,如果当前点能分叉出一条直径,那么这条直径后面的点都不可能被所有直径穿过了,于是我们找到第一个能分叉的点,然后再从这个点往回遍历,找到第一个能分叉的点,这2个点中间的路径的边即为所求. 代码就算了吧,打这题时我…
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013的参赛者,你需要保护出题人铭铭. 僵尸从唯一一条笔直道路接近,你们需要在铭铭的房门前放置植物攻击僵尸,避免僵尸碰到房子. 第一关,一只血量为\(a_1\)点的墦尸从距离房子\(x_1\)米处速接近,你们放置了攻击力为\(y_1\)点/秒的植物进行防御:第二关,…
P3297 [SDOI2013]逃考 题意 给一个平面矩形,里面有一些有标号点,有一个是人物点,人物点会被最近的其他点控制,人物点要走出矩形,求人物点最少被几个点控制过. 保证一开始只被一个点控制,没有点在矩阵边界上 多组数据\(t\le 3\),点数\(\le600\). 画一画图可以发现 对每个点,这个点和另一个点的垂直平分线可以划分这两个点的控制区域,每个点搞出\(n-1\)个垂直平分线,然后加上边界的四条,做半平面交,然后对每个点向最后半平面交留下的线所代表的点连边,跑最短路就可以了,复…
树的直径两遍dfs救星了 至于一定在直径中的边数,可以发现这些边一定是连续的(不然你两条直径中间能有空挡?),然后,如果某个点往下有多条直径,那么这条点以下都不算入答案.所以以直径分别两端点为根,找出这样离根最近的点(注意最远的点就是另一个端点),然后找到那两个点的距离就是答案 // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long long #define il inline #define re register…
P3302 [SDOI2013]森林 题目描述 小\(Z\)有一片森林,含有\(N\)个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有\(M\)条边. 小Z希望执行\(T\)个操作,操作有两类: Q x y k查询点\(x\)到点\(y\)路径上所有的权值中,第\(k\)小的权值是多少.此操作保证点\(x\)和点\(y\)连通,同时这两个节点的路径上至少有\(k\)个点. L x y在点\(x\)和点\(y\)之间连接一条边.保证完成此操作后,仍然是一片森林. 为了体现程序的在线…
传送门 思路 很明显的一个思路:先搞出有多少种珠子,再求有多少种项链. 珠子 考虑这个式子: \[ S3=\sum_{i=1}^a \sum_{j=1}^a\sum_{k=1}^a [\gcd(i,j,k)==1] \] 显然可以莫比乌斯反演一波,但这个是对的吗? 当有两个数字相同时只被算了3遍,而三个都相同的只被算了一遍. \[ S2=\sum_{i=1}^a\sum_{j=1}^a [\gcd(i,j)==1] \] 显然有\(S1=1\),那么就会得到最终答案: \[ ans=\frac…
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接在树上建主席树 然后难点在于连接 用启发式合并就可以了(想了半天都没想出来) 每次合并时,我们把小的树接到大的上,然后dfs一遍小的树,更新信息 然后注意数组……别太小也别太大……(被数组大小坑了好几次提交) //minamoto #include<bits/stdc++.h> using nam…
->题目链接 题解: #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 160001 #define D 15 using namespace std; ]; int t,x,y,z; int n,m,qq,tot,cut,ans,father[MAXN],dis[MAXN]; ]; s…