P8973 『GROI-R1』 继续深潜,为了同一个梦想
P8973 『GROI-R1』 继续深潜,为了同一个梦想
P8973 『GROI-R1』 继续深潜,为了同一个梦想 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目大意
我称一棵树上的一个点集是“连接的”,当且仅当树上存在一条链能够覆盖这个点集并且这个集合大小不小于 2
对于每个点,询问每个点被多少个这样的点集所包含
设
输出
思路
换根
设
那么:
因为
我算出所有
其实就是
那么:
设
那么:
实现的时候两条链组成一条新的链时不要多加了
接下来考虑换根,
其他的点
code
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define LL long long
using namespace std;
const int N = 5e5 + 5;
const LL mod = 1e9 + 7;
int hd[N] , cnt , n , fa[N];
LL f[N] , ans[N];
struct E {
int to , nt;
} e[N << 1];
void add (int x , int y) { e[++cnt].to = y , e[cnt].nt = hd[x] , hd[x] = cnt; }
void dfs1 (int x) {
int y;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
if (y == fa[x]) continue;
fa[y] = x;
dfs1 (y);
f[x] = (f[x] + f[y] * 2 % mod + 1) % mod;
}
}
void dfs2 (int x) {
int y;
LL sum = 0;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
sum = (sum + 2 * f[y] % mod + 1) % mod;
}
LL g;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
g = (f[y] * 2 % mod + 1) % mod;
ans[x] = (ans[x] + g * ((sum - g + mod + 1) % mod) % mod) % mod;
sum = (sum - g + mod) % mod;
}
LL xx , yy;
for (int i = hd[x] ; i ; i = e[i].nt) {
y = e[i].to;
if (y == fa[x]) continue;
xx = f[x] , yy = f[y];
f[x] = (xx + mod - (yy * 2 % mod + 1) % mod) % mod;
f[y] = (yy + f[x] * 2 % mod + 1) % mod;
dfs2 (y);
f[x] = xx , f[y] = yy;
}
}
int main () {
int u , v;
scanf ("%d" , &n);
fu (i , 1 , n - 1) {
scanf ("%d%d" , &u , &v);
add (u , v) , add (v , u);
}
dfs1 (1);
dfs2 (1);
LL ans1 = ans[1] * 1;
fu (i , 2 , n) ans1 = ans1 ^ (ans[i] * i);
printf ("%lld" , ans1);
return 0;
}
如果人生会有很长,愿有你的荣耀永不散场
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端