尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

zjoi2019 语言

zjoi2019 语言
📅 发布时间:2026/6/20 0:48:48

好题好题。

我们先对一个结点 \(u\) 进行分析。

发现能对 \(u\) 产生贡献的所有结点可以构成一个联通分量。

只有经过 \(u\) 才会对 \(u\) 产生贡献。

而我们不可能将一条链上的所有点都扔到 \(u\) 上,这显然不现实,肯定是进行计算,算出来的,而且光一个结点都需要 \(O(n^2)\) 的内存,明显很没有前途。

考虑一条链的两端 \(l,r\) 挂在 \(u\) 上,类似一个虚树,考虑有 \(n\) 个叶子的时候我们是如何计算一颗虚树的大小的。

先对其的 dfs 序排序,\(siz = \sum dep_{a_i} - \sum dep_{LCA(a_i,a_i+1)} - dep _{LCA(a_1,a_n)}\)。dfs 序从小到大放,加入 dep 的时候会与 dfs 前面那一个产生交错, 这一部分就是 \(dep_{LCA(a_i,a_{i-1})}\) 。 最后我们因为钦定了 1 为根,去掉的话就是 \(-dep_{LCA_{i=1}^n a_i}\) 有dfs 序的性质可知其等于 \(-dep_{LCA(a_1,a_n)}\)。

好了那我们需要将所有的结点都算出来,明显可以树上差分。而我们发现如上的操作刚好可以使用线段树来维护,那树上的线段树肯定会想到线段树合并,不然这空间都得炸。

代码:

#include<bits/stdc++.h>
#define hnczy "language"
using namespace std;
const int N=5E5+5;
int st[20][N],dfn[N],lg[N];
int dep[N],fa[N],cnt,n,m;
vector<int>e[N],del[N];long long ans;
int calc(int x,int y){return dep[x]<dep[y]?x:y;}
int LCA(int x,int y){if(!x || !y)return 0;if(x==y)return x;x=dfn[x],y=dfn[y];if(x>y)swap(x,y);int tmp=lg[y-x++];return calc(st[tmp][x],st[tmp][y-(1<<tmp)+1]);
} 
struct SEG{struct node{int ls,rs,L,R,val,c;}c[N<<4];#define ls(p) c[p].ls#define rs(p) c[p].rs#define mid ((l+r)>>1) int rt[N],tot;void pushup(int p){c[p].L= c[ls(p)].L?c[ls(p)].L:c[rs(p)].L ;c[p].R= c[rs(p)].R?c[rs(p)].R:c[ls(p)].R ;c[p].val =c[ls(p)].val +c[rs(p)].val - dep[LCA(c[ls(p)].R,c[rs(p)].L )] ;}int query(int u){return c[u].val - dep[LCA(c[u].L,c[u].R)] ;}void change(int &p,int l,int r,int x,int w){if(!p)p = ++tot; if(l==r){c[p].c +=w;c[p].val = (c[p].c ? dep[x]:0);c[p].L = c[p].R = (c[p].c ? x:0);return ;}if(dfn[x]<=mid)change(ls(p),l,mid,x,w);else change(rs(p),mid+1,r,x,w);pushup(p); }void merge(int &p,int q,int l,int r){if(!p || !q)return p|=q,void();if(l==r)return c[p].c += c[q].c , c[p].val |= c[q].val, c[p].L |= c[q].L , c[p].R |= c[q].R,void() ;merge(ls(p),ls(q),l,mid),merge(rs(p),rs(q),mid+1,r);pushup(p);}
}seg;void dfs1(int u,int F){dep[u] =dep[F] +1,fa[u] =F;st[0][dfn[u] = ++cnt]=F;for(int v:e[u])if(v!=F)dfs1(v,u);
}void dfs2(int u){for(int v:e[u]) if(v!=fa[u])dfs2(v);for(int v:del[u]) seg.change(seg.rt[u],1,cnt,v,-1);ans+=seg.query(seg.rt[u]);seg.merge(seg.rt[fa[u]],seg.rt[u],1,cnt); 
}
int main(){freopen(hnczy ".in", "r", stdin);freopen(hnczy ".out", "w", stdout);scanf("%d%d",&n,&m);for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);  }dfs1(1,0);for(int i=1;i<=19;i++)for(int j=1;j+(1<<i-1)<=n;j++)st[i][j] = calc(st[i-1][j],st[i-1][j+(1<<i-1)]);for(int i=2;i<=n;i++)lg[i] = lg[i>>1]+1; for(int i=1,u,v;i<=m;i++){scanf("%d%d",&u,&v);int lca= LCA(u,v);seg.change(seg.rt[u],1,cnt,u,1);seg.change(seg.rt[u],1,cnt,v,1);seg.change(seg.rt[v],1,cnt,u,1);seg.change(seg.rt[v],1,cnt,v,1);del[lca] .push_back(u),del[lca].push_back(v);del[fa[lca]] .push_back(u),del[fa[lca]].push_back(v);}dfs2(1);cout<<ans/2; return 0;
}

相关新闻

  • 2025-07-21-Mon-T-RocketMQ
  • P24_现有网络模型的使用及修改
  • 20232403 2025-2026-1 《网络与系统攻防技术》实验六实验报告

最新新闻

  • MC68340指令集深度解析:从CISC寻址到系统控制与性能优化
  • 深入解析MC68HC908EY16A:8位MCU架构、外设与低功耗设计实战
  • MC68HC908看门狗与CPU核心:嵌入式系统可靠性的硬件守护者
  • 2026清远2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • Mac上的Windows启动盘制作革命:WinDiskWriter全方位指南
  • 2026行业内优秀非法吸收公众存款罪刑事律师口碑推荐 - 品牌排行榜

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号