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

P11967 [GESP202503 八级] 割裂

解题思路

问题分析

我们需要找到满足以下条件的节点:

  1. 删除该节点后,所有好点对仍然连通

  2. 删除该节点后,坏点对不连通

关键思路

  1. 好点对连通性分析:

    • 如果一个节点在某个好点对的路径上,删除它会导致该好点对不连通

    • 因此,能被删除的节点不能在任何好点对的路径上

    • 使用树上差分标记所有好点对路径上的节点

  2. 坏点对连通性分析:

    • 删除节点后坏点对要不连通,说明该节点必须在坏点对的路径上

    • 因此,能被删除的节点必须在坏点对的路径上

  3. 综合条件:

    • 节点必须在坏点对路径上

    • 节点不能在任何一个好点对路径上

算法步骤

  1. 构建树并预处理LCA

  2. 使用树上差分标记所有好点对路径上的节点

  3. 遍历坏点对路径,统计满足条件的节点

代码注释

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int N = 1e6 + 10,inf = 0x3f3f3f3f;
vector<int> g[N];  // 邻接表存储树
int n,m;           // n:节点数, m:好点对数量
int s[N];          // 备用数组
vector<pii> a;     // 存储好点对
int vis[N];        // 备用标记数组
int f[N][25],dep[N]; // f:倍增数组, dep:节点深度
int b1,b2;         // 坏点对的两个节点
int ans;           // 答案:满足条件的节点数
int d[N];          // 差分数组,标记好点对路径上的节点// DFS预处理LCA和深度
void dfs(int x,int fa)
{f[x][0] = fa;           // 直接父节点dep[x] = dep[fa] + 1;   // 深度为父节点深度+1// 预处理倍增数组for(int i = 1; i <= 20; i++){int y = f[x][i - 1];f[x][i] = f[y][i - 1];}// 递归处理子节点for(int i = 0; i < g[x].size(); i++){int y = g[x][i];if(y == fa) continue;dfs(y,x);}
}// DFS计算差分数组的前缀和
void dfs2(int x,int fa)
{for(int i = 0; i < g[x].size(); i++){int y = g[x][i];if(y == fa) continue;dfs2(y,x);d[x] += d[y];  // 子节点的值累加到父节点
    }
}// 求两个节点的最近公共祖先(LCA)
int lca(int x,int y)
{// 确保x是深度较大的节点if(dep[x] < dep[y]) swap(x,y);// 将x提升到与y同一深度for(int i = 20; i >= 0; i--){int fa = f[x][i];if(dep[fa] >= dep[y]){x = fa;}} if(x == y) return x;  // 如果相等,y就是LCA// 同时提升x和y直到它们的父节点相同for(int i = 20; i >= 0; i--){int fx = f[x][i],fy = f[y][i];if(fx != fy){x = fx,y = fy;}}return f[x][0];  // 返回LCA
}int main()
{cin >> n >> m;// 读入树结构for(int i = 1; i < n; i++){int x,y; cin >> x >> y;g[x].push_back(y);g[y].push_back(x);}// 预处理LCAdfs(1,0);// 处理所有好点对for(int i = 1; i <= m; i++){int x,y; cin >> x >> y;int rt = lca(x,y);  // 求好点对的LCA// 树上差分标记好点对路径上的节点// 在x和y处+1,在LCA处-1,在LCA的父节点处-1d[x]++,d[y]++,d[rt]--,d[f[rt][0]]--;}// 计算差分数组的前缀和,d[x] > 0 表示节点x在某个好点对的路径上dfs2(1,0);// 读入坏点对cin >> b1 >> b2;int rt = lca(b1,b2);  // 坏点对的LCA// 遍历坏点对路径,统计满足条件的节点// 条件:在坏点对路径上(d[节点] == 0)且不在任何好点对路径上while(b1 != rt){if(d[b1] == 0) ans++;  // 不在好点对路径上b1 = f[b1][0];         // 向LCA移动
    }while(b2 != rt){if(d[b2] == 0) ans++;  // 不在好点对路径上b2 = f[b2][0];         // 向LCA移动
    }if(d[rt] == 0) ans++;      // 检查LCA本身
    cout << ans;return 0;
}

 

http://www.sczhlp.com/news/176345/

相关文章:

  • 用 Ada 实现英文数字验证码识别
  • 摄影手机网站模板c#网站开发案例大全
  • 北京手机网站设计价格第五届中国国际进口博览会开幕
  • 网站建设的实训报告怎么写word模板
  • 加强宣传阵地建设 高校 网站网站标题用空格 逗号影响seo
  • 一个人做网站难吗网上购物哪个平台质量好又便宜
  • 北京网站开发月薪福永网站制作
  • dedecms金融网站模板wordpress po
  • 企业网站开发模板旅游网站策划案
  • 网站设计公司 广州自适应营销网站
  • 网站字体使用平面设计培训平台
  • 用什么语言能写网站吗搜索引擎排名
  • 自助建网站教程下载类的wordpress模板
  • 深圳网站备案拍照点永久免费域名空间
  • 现在网站如何做优化金华义乌网站建设
  • 信息门户网站制作网络营销是什么活动
  • ks免费刷粉网站推广低价seo怎么做最佳
  • 注册商标有什么好处和坏处山西网站seo
  • 摄影师网站模板郓城微信网站建设
  • 高新区建网站外包网站平台管理
  • 网站制作服务多语种外贸网站
  • 网站挂服务器后图片不显示美工宝盒网站
  • 触屏版网站开发样式南阳公司注册
  • 武进网站建设价位支付网站建设费会计分录
  • 土特产网站模板 织梦如何做阿里详情页面链接到外部网站
  • 企业网站模板源码资源下载南京中石化第五建设有限公司
  • 1.简述网站建设流程道滘做网站
  • 印度乡村AI计划:用JAN AI打造人工智能优先村庄
  • # Java方法学习:动手动脑与课后实验整理
  • CF2155D Batteries