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

CF555E Case of Computer Network TJ

CF555E Case of Computer Network TJ

前置知识

  1. 树上差分

    如果想对一条路径上的所有边 / 点同时加上一个相同的值(称为边 / 点差分),我们可以通过树上差分来达到 \(O(\log n)\) 修改,查询的时候 \(O(n)\) 做一遍子树和即可,这里只讲边差分。

    如果我们想对 \((u, v)\) 这两个点之间的所有边都增加一个值 \(k\)

    \(d_u \rightarrow d_u + k\)\(d_v \rightarrow d_v + k\)\(d_{lca} \rightarrow d_{lca} - 2k\)

    我们把边的权值下放到深度较深的的节点那。

    仿照数组上差分,我们有 \(d_u + 1\) 相当于从根节点到 \(u\) 的路径上的所有边 \(+ 1\)

    现在再去理解上面三个式子就非常的简单了。

    \(u \rightarrow v\) 相当于 \(u \rightarrow \operatorname{lca}(u, v) \rightarrow v\)

思路

这里才是正解

  • 题意

    给你一个无向图,让你对每条边定向。

    要求满足 \(q\)\((a, b)\),问有没有一种方式使得对于每一组 \({(a, b)}\),都能从 \(a\) 到达 \(b\)

  • 思路

    有一个很漂亮的性质:在一个边双里的点一定可以通过某种定向来互相到达

    证明如下:

    • 我们可以把删去那条边之后的边都按一个顺序连接,这个时候就会形似一个链,这时候再把那条边加上,就一定可以互相到达了(首连尾)。

    这时候我们就可以把处于一个边双里的点缩成一个点,只考虑桥边的定向。我们就可以记两个数组 \(up\)\(down\)。表示这条边是否需要向上跳。然后用树上差分快速修改即可。

    如果不合法就一定是有一条边既要往上又要往下。

代码

#include <bits/stdc++.h>const int N = 2e5 + 10;struct E {int v;int nxt;
} e[N << 1]; int head[N], cnt;__inline void add(int u, int v) { e[cnt] = {v, head[u]}; head[u] = cnt++; }int dfn[N], low[N], bel[N], tot, bcc_cnt;
std::vector<int> stk;
std::vector<int> edge[N];__inline void Tarjan(int u, int from) {dfn[u] = low[u] = ++tot;stk.emplace_back(u);for (int i = head[u]; i != -1; i = e[i].nxt) {int v = e[i].v;if ((i ^ 1) == from) continue;if (!dfn[v]) {Tarjan(v, i);low[u] = std::min(low[u], low[v]);	}else low[u] = std::min(low[u], dfn[v]);}if (low[u] == dfn[u]) {bcc_cnt++;int x;do {x = stk.back(); stk.pop_back();bel[x] = bcc_cnt;} while (x != u);	}
}int dep[N], fa[N][25];
bool vis_dfs[N];
__inline void dfs(int u, int f) {vis_dfs[u] = true;dep[u] = dep[f] + 1;fa[u][0] = f;for (int i = 0; fa[u][i]; i++) fa[u][i + 1] = fa[fa[u][i]][i];for (int v : edge[u])if (v != f && !vis_dfs[v])dfs(v, u);
}__inline int lca(int u, int v) {if (dep[u] < dep[v]) std::swap(u, v);for (int i = 21; ~i; i--) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];if (u == v) return u;for (int i = 21; ~i; i--)if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];return fa[u][0];
}int faa[N];
__inline int find(int x) { return faa[x] = (faa[x] == x ? x : find(faa[x])); }
__inline void merge(int u, int v) { if (find(u) != find(v)) faa[find(u)] = find(v); }int up[N], down[N];
bool vis_sum[N];
__inline void modify(int u, int v, int *arr) {int L = (dep[u] < dep[v] ? u : v);arr[u] += 1;arr[v] += 1;arr[L] -= 2;
}__inline void get_sum(int u, int f) {vis_sum[u] = true;for (int v : edge[u]) {if (v != f && !vis_sum[v]) {get_sum(v, u);down[u] += down[v];up[u] += up[v];}}
}bool vis_check[N];
void check(int u, int f) {vis_check[u] = true;for (int v : edge[u]) {if (v == f) continue;if (up[v] > 0 && down[v] > 0) {std::cout << "No\n";exit(0);}if (!vis_check[v])check(v, u);}
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);memset(head, -1, sizeof head);int n, m, q;std::cin >> n >> m >> q;for (int i = 1; i <= m; i++) {int u, v;std::cin >> u >> v;add(u, v);add(v, u);}for (int i = 1; i <= n; i++)if (!dfn[i])Tarjan(i, -1);	for (int i = 1; i <= bcc_cnt; i++)faa[i] = i;for (int u = 1; u <= n; u++) {for (int id = head[u]; ~id; id = e[id].nxt) {int v = e[id].v;if (bel[v] == bel[u]) continue;edge[bel[u]].emplace_back(bel[v]);edge[bel[v]].emplace_back(bel[u]);merge(bel[u], bel[v]);}}for (int i = 1; i <= bcc_cnt; i++)if (!vis_dfs[i])dfs(i, 0);for (int i = 1; i <= q; i++) {int u, v;std::cin >> u >> v;int ndu = bel[u], ndv = bel[v];if (ndu == ndv) continue;if (find(ndu) != find(ndv)) {std::cout << "No\n";return 0;	}else {int L = lca(ndu, ndv);if (ndu == L) modify(ndu, ndv, down);else if (ndv == L) modify(ndu, ndv, up);else { modify(ndu, L, up); modify(L, ndv, down); }}}for (int i = 1; i <= bcc_cnt; i++)if (!vis_sum[i]) get_sum(i, 0);for (int i = 1; i <= bcc_cnt; i++)if (!vis_check[i]) check(i, 0);std::cout << "Yes\n";return 0;
}

不要在意奇奇怪怪的码风 / __inline

http://www.jsqmd.com/news/416266/

相关文章:

  • 告别售后乱象|BH售后服务中心认准原厂保障更省心 - 冠顶工业设备
  • pip在venv环境安装依赖包的问题
  • 深入解析Java字符串:从不可变性到高效构建,全面掌握String核心操作
  • 鸿蒙应用开发深度探索:从基础到实战与面试准备
  • 产后焕新,温柔自愈|武汉普拉提产后修复,陪宝妈重拾轻盈体态 - 冠顶工业设备
  • 数据库-分类介绍
  • 2026年2月佛山新中式家具工厂,餐厅系列家具材质对比解析 - 品牌鉴赏师
  • 股市赚钱学概论:答疑:凭什么认为股票能涨
  • 2026年调味羊肉馅/牛肉馅厂家信誉综合参考 - 品牌宣传支持者
  • 合规好用的干式细胞复苏仪厂商推荐,上海地区靠谱的有哪些 - 工业品网
  • 想找靠谱的汽车脚垫制造厂,广州车百强值得推荐吗? - 工业推荐榜
  • 唐山舒同眼视光中心近视矫正价格多少,是否在可接受范围? - 工业设备
  • 深度学习Yolov8模型 训练无人机视角罂粟检测数据集 通过训练出的无人机航拍罂粟检测数据集权重 建立基于深度学习Yolov8罂粟识别检测系统
  • 通过aws rust sdk 连接oss
  • 20260206动态树LCT - Link
  • 最新中国十大品牌全案公司权威排行榜(附选型指南) - 品牌排行榜
  • 食品品牌全案公司推荐:新消费专精+爆品战略(机构对比) - 品牌排行榜
  • 盘点常用的满意度调研网站有哪些:头部机构汇总(选型指南) - 品牌排行榜
  • 推荐下江苏专业做流体仿真服务的公司?2026原创优选指南 - 冠顶工业设备
  • 肌肉劳损吃保健品哪个品牌好?2026专业品牌测评(选购指南) - 品牌排行榜
  • 深圳尚米网络|简历AI解析+岗位自动评估,告别手动比对 - 搭贝
  • 2026年Q1口碑好的太阳能热水器公司选哪家 - 2026年企业推荐榜
  • 棉花音乐 4.0.0 | 网盘音乐播放器 支持多种云端存储 打造无损音乐库
  • 2026年值得关注的奶咖豆品牌推荐 - 品牌排行榜
  • 2026入门手冲豆品牌推荐:新手友好风味之选 - 品牌排行榜
  • 华为OD机考双机位C卷 - 可以组成网络的服务器 (Java Python JS GO C++ C)
  • 2026哪家可以生产化妆品原料视黄醇亚油酸酯 - 品牌排行榜
  • 2026年值得关注的soe咖啡豆品牌推荐 - 品牌排行榜
  • 2026高稳定性视黄醇亚油酸酯厂家排名及选择参考 - 品牌排行榜
  • 2026生产视黄醇亚油酸酯的厂家推荐及选择参考 - 品牌排行榜