当前位置: 首页 > news >正文

题解:P10121 『STA - R4』保险丝

6.2内训模拟赛题。

P10121 『STA - R4』保险丝

显然点越靠近点 u 越容易成为 u 的半邻域,越远离点 u 越不容易成为 u 的半邻域,所以点 u 的半邻域是一个连通块状。

需要一点注意力可以发现度数为 1 或 2 的点作为 v 时无贡献(Fibonacci 数列第一、二项都为 1),称度数 >= 2 的点为分叉点,进一步可以发现一个分叉点往上跳直到跳到上一个分叉点之前(类似于提取下面带分叉上为链状结构)作为 u 的贡献都是一样的,可以一起处理掉。

核心部分的计算流程是,

  • 把树拍成 dfs 序列,子树编号连续
  • 先算出半邻域的点数:\(x\) 的半邻域内点 \(y\) 满足 \(dep_y-dep_x \le dist_y\),因此 \(dep_x \ge dep_y - dist_y\),按 \(dep\) 分层后双指针。
  • 求出每个点的半邻域中所有的分叉点
  • 依次计算 \(f_i\),在线段树上单点加上分叉点的贡献,区间查询贡献积。注意要按照从下到上的顺序加入线段树。

这么做时间正确的原因是,n 个点半领域和上界是 \(O(nlogn)\),证明考虑构造一棵满二叉树,一个节点最多在 \(logn\) 个点的半邻域内。于是这样做就是 \(O(nlog^2n)\) 的,而且这是跑不满的所以可以过 1e6。略微卡常,洛谷上需要评测机波过去。为啥场上最优解是 \(O(n^2)\) 的,谴责赛时水水数据。

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define lc rt * 2
#define rc rt * 2 + 1
#define mid ((l + r) >> 1)
using namespace std;
const int N = 1000010;
const int p = 994007158;
int hed[N],nxt[N * 2],to[N * 2],n,tote,deg[N],totf,d[N],dep[N],fb[N],ans[N],tp[N];
int sta[N],tots,dfn[N],totn,sz[N],b[N],Tr[N],pt[N],tr[N * 4],faa[N];
vector<int> v[N],f[N];
void add(int &x,int y){x += y;if(x >= p)x -= p;}
void addedge(int x,int y){tote++,nxt[tote] = hed[x],to[tote] = y,hed[x] = tote;}
void dfs1(int x,int fa){d[x] = 1e9;dep[x] = dep[fa] + 1,faa[x] = fa;for(int i = hed[x]; i; i = nxt[i]){int y = to[i];if(y == fa)continue;dfs1(y,x);d[x] = min(d[x],d[y] + 1);}if(d[x] == 1e9)d[x] = 0;
}
void dfs2(int x,int fa){if(deg[x] > 2 || x == 1)tp[x] = sta[tots],sta[++tots] = x;dfn[x] = ++totn;sz[x] = 1;for(int i = hed[x]; i; i = nxt[i]){int y = to[i];if(y == fa)continue;d[y] = min(d[y],d[x]);dfs2(y,x);sz[x] += sz[y];}if(deg[x] > 2 || x == 1)tots--;
}
bool cmp(int x,int y){return dep[x] - d[x] < dep[y] - d[y];}
void addT(int x,int y){x++;for(; x <= n + 1; x += (x & -x))Tr[x] += y;}
int sumT(int x){x++;int res = 0;for(; x; x -= (x & -x)){res += Tr[x];}return res;}
void build(int rt,int l,int r){tr[rt] = 1;if(l == r){return;}build(lc,l,mid);build(rc,mid + 1,r);
}
void modify(int rt,int l,int r,int x,int y){if(l == r){tr[rt] = y;return;}if(mid >= x)modify(lc,l,mid,x,y);else modify(rc,mid + 1,r,x,y);tr[rt] = tr[lc] * tr[rc] % p;
}
int query(int rt,int l,int r,int x,int y){if(l >= x && r <= y)return tr[rt];int res = 1;if(mid >= x)res = res * query(lc,l,mid,x,y) % p;if(mid + 1 <= y)res = res * query(rc,mid + 1,r,x,y) % p;return res;
}
signed main(){//freopen("fuse.in","r",stdin);//freopen("fuse.out","w",stdout);scanf("%lld",&n);fb[1] = fb[2] = 1;for(int i = 3; i <= n; i++)fb[i] = (fb[i - 1] + fb[i - 2]) % p;for(int i = 2,x; i <= n; i++)scanf("%lld",&x),addedge(i,x),addedge(x,i),deg[i]++,deg[x]++;dfs1(1,0);dfs2(1,0);for(int i = 1; i <= n; i++)b[i] = i,v[dep[i]].push_back(i);sort(b + 1,b + n + 1,cmp);for(int i = 1,j = 0; i <= n; i++){while(j < n && dep[b[j + 1]] - i <= d[b[j + 1]])addT(dfn[b[++j]],1);for(int j = 0; j < v[i].size(); j++){pt[v[i][j]] = sumT(dfn[v[i][j]] + sz[v[i][j]] - 1) - sumT(dfn[v[i][j]] - 1);}}for(int i = n; i >= 1; i--){int x = b[i];if(x != 1 && deg[x] <= 2)continue;for(int j = x; j && dep[x] - dep[j] <= d[x]; j = faa[j])f[j].push_back(x);}build(1,1,n);for(int i = 1; i <= n; i++){for(int j = 0; j < f[i].size(); j++){int x = f[i][j];modify(1,1,n,dfn[x],fb[deg[x]]);add(ans[i],query(1,1,n,dfn[x],dfn[x] + sz[x] - 1) * (dep[x] - max(dep[tp[x]],dep[i] - 1)) % p);pt[i] -= dep[x] - max(dep[tp[x]],dep[i] - 1);}add(ans[i],pt[i]);for(int j = 0; j < f[i].size(); j++)modify(1,1,n,dfn[f[i][j]],0);}int Ans = 0;for(int i = 1; i <= n; i++)Ans ^= ans[i];printf("%lld",Ans);return 0;
}
http://www.zskr.cn/news/1453218.html

相关文章:

  • 5分钟搭建Python股票数据分析系统:MOOTDX让你轻松玩转通达信数据
  • 泰和县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • Linux系统篇(一):从零入门操作系统:冯诺依曼体系到进程的完整理解
  • 如何用Scarab模组管理器一键解锁空洞骑士无限可能:完整指南
  • UE5项目上线前必做:如何安全清理GEngine调试消息,避免性能泄露与信息暴露
  • Java 程序员第 41 阶段03:企业智能问答机器人落地,搭建内部智能客服系统,多轮对话与意图识别实现
  • 万年县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • WPF桌面端音频波形实时绘制工具(C# + NAudio,支持录音/播放/可视化)
  • pET-28a(+)里的‘隐形管家’:除了T7启动子,这些低调元件如何影响你的蛋白表达成败?
  • SynapseML:统一大规模机器学习工作流的开源库实战解析
  • 沈阳智能工厂申报服务机构排行 核心服务能力解析 - 互联网科技品牌测评
  • STM32开发效率翻倍!深度挖掘Keil5工具栏那些被你忽略的快捷键与隐藏功能
  • 2026年成都企业定制酱酒与茅台镇坤沙酒怎么选?盈贵人酒业深度横评与避坑指南 - 优质企业观察收录
  • 【MATLAB】基于MATLAB的BLE通信链路仿真与性能分析
  • 陈刚直言 | 工业 AI 做不成产品,不在 AI,而在泛化能力
  • 光伏电站的“空中巡检员”:无人机如何用AI读懂每一块光伏板?
  • 手机号逆向查询QQ号:技术解析与实践指南
  • 避坑指南:在Ubuntu 24.04上搞定Madagascar地震数据处理软件(附22.04差异点)
  • 新沂市26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 论文精读:过去十年计算机视觉与深度学习在作物生长管理中的核心技术方法
  • 别再为gradle下载慢发愁了!手把手教你用腾讯镜像源搞定UniApp安卓原生插件开发环境
  • 峡江县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 微信聊天记录永久保存指南:揭秘开源备份工具的核心技术
  • 【西游劫:第三篇】 API 路由设计详解
  • 从Pwn到实战:用IDA Pro和Ghidra手把手分析CTF二进制逆向题(附解题脚本)
  • 深入vsomeip:从Unix Domain Socket看高性能IPC如何实现(附Wireshark抓包分析)
  • 网盘下载困境的破解方案:LinkSwift直链下载助手深度解析
  • 医用超声图像后处理中的帧率算法:原理、优化与实践
  • 网盘直链下载助手:一键获取真实下载地址的终极解决方案
  • 深入内核:拆解WCH CH32V303的SDI Printf机制,对比它与SEGGER RTT和传统串口的异同