题目蓝链

Description

给定一个无向图,需要支持两个操作,断掉一条边或者询问两个点之间的路径上有多少个桥

Solution

考虑把操作离线,然后时光倒流一下。初始的时候所有的边权值都为\(1\),把加入边后形成的环直接置成\(0\)。询问就直接查询两点之间的链上权值和

Code

#include <bits/stdc++.h>using namespace std;#define fst first
#define snd second
#define squ(x) ((LL)(x) * (x))
#define debug(...) fprintf(stderr, __VA_ARGS__)typedef long long LL;
typedef pair<int, int> pii;inline int read() {int sum = 0, fg = 1; char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') fg = -1;for (; isdigit(c); c = getchar()) sum = (sum << 3) + (sum << 1) + (c ^ 0x30);return fg * sum;
}const int maxn = 3e4 + 10;
const int maxm = 2e5 + 10;int n, m, cnt;vector<int> g[maxn];
multiset<pii> Set;struct node {int x, y, ty;
}tt[maxm];int Fa[maxn], S[maxn];
int find(int x) { return x == Fa[x] ? x : Fa[x] = find(Fa[x]); }namespace ST {
#define ls (rt << 1)
#define rs (rt << 1 | 1)int A[maxn << 2], tag[maxn << 2];void push_up(int rt) { A[rt] = A[ls] + A[rs]; }void push_down(int rt, int l, int r) {if (~tag[rt]) {tag[ls] = tag[rs] = tag[rt];int mid = (l + r) >> 1;A[ls] = tag[rt] * (mid - l + 1);A[rs] = tag[rt] * (r - mid);tag[rt] = -1;}}void change(int rt, int l, int r, int L, int R, int v) {if (L <= l && r <= R) {A[rt] = v * (r - l + 1), tag[rt] = v;return;}push_down(rt, l, r);int mid = (l + r) >> 1;if (L <= mid) change(ls, l, mid, L, R, v);if (R > mid) change(rs, mid + 1, r, L, R, v);push_up(rt);}int query(int rt, int l, int r, int L, int R) {if (L <= l && r <= R) return A[rt];push_down(rt, l, r);int mid = (l + r) >> 1, res = 0;if (L <= mid) res += query(ls, l, mid, L, R);if (R > mid) res += query(rs, mid + 1, r, L, R);return res;}void init() {memset(tag, -1, sizeof tag);change(1, 1, n, 1, n, 1);}
}int d[maxn], fa[maxn], sz[maxn], top[maxn], hs[maxn];
int Index, dfn[maxn];void dfs1(int now, int f) {d[now] = d[f] + 1, fa[now] = f, sz[now] = 1;int ms = 0;for (int i = 0; i < g[now].size(); i++) {int son = g[now][i];if (son == f) continue;dfs1(son, now);sz[now] += sz[son];if (sz[son] > sz[ms]) ms = son;}hs[now] = ms;
}void dfs2(int now, int topf) {dfn[now] = ++Index;top[now] = topf;if (!hs[now]) return;dfs2(hs[now], topf);for (int i = 0; i < g[now].size(); i++) {int son = g[now][i];if (son == fa[now] || son == hs[now]) continue;dfs2(son, son);}
}void change(int x, int y, int v) {while (top[x] != top[y]) {if (d[top[x]] < d[top[y]]) swap(x, y);ST::change(1, 1, n, dfn[top[x]], dfn[x], v);x = fa[top[x]];}if (d[x] > d[y]) swap(x, y);if (dfn[x] < dfn[y]) ST::change(1, 1, n, dfn[x] + 1, dfn[y], v);
}int query(int x, int y) {int res = 0;while (top[x] != top[y]) {if (d[top[x]] < d[top[y]]) swap(x, y);res += ST::query(1, 1, n, dfn[top[x]], dfn[x]);x = fa[top[x]];}if (d[x] > d[y]) swap(x, y);if (dfn[x] < dfn[y]) res += ST::query(1, 1, n, dfn[x] + 1, dfn[y]);return res;
}int main() {freopen("line.in", "r", stdin);freopen("line.out", "w", stdout);n = read(), m = read();for (int i = 1; i <= m; i++) {int x = read(), y = read();if (x > y) swap(x, y);Set.insert((pii){x, y});}int op;while (~(op = read())) {int x = read(), y = read();if (x > y) swap(x, y);if (!op) Set.erase(Set.lower_bound((pii){x, y}));tt[++cnt] = (node){x, y, op};}for (int i = 1; i <= n; i++) Fa[i] = i;for (multiset<pii>::iterator it = Set.begin(); it != Set.end(); ++it) {int x = it->fst, y = it->snd;if (find(x) == find(y)) { tt[++cnt] = (node){x, y, 0}; continue; }Fa[find(x)] = find(y);g[x].push_back(y), g[y].push_back(x);}dfs1(1, 0);dfs2(1, 1);ST::init();for (int i = cnt; i >= 1; i--) {if (tt[i].ty) S[++S[0]] = query(tt[i].x, tt[i].y);else change(tt[i].x, tt[i].y, 0);}for (int i = S[0]; i >= 1; i--) printf("%d\n", S[i]);return 0;
}

转载于:https://www.cnblogs.com/xunzhen/p/9971783.html

BZOJ1969 [AHIO2005]航线规划相关推荐

  1. BZOJ1969: [Ahoi2005]LANE 航线规划

    BZOJ1969: [Ahoi2005]LANE 航线规划 Description 对Samuel星球的探险已经取得了非常巨大的成就,于是科学家们将目光投向了Samuel星球所在的星系--一个巨大的由 ...

  2. 无人机怎么设定航线_收藏!老飞手的航线规划笔记在这里...(上篇)

    ​关注公众号"三维前沿",获取无人机.内外业技巧最新干货. 外业航线的布设尤为重要,因为要保证获取的影像满足测绘行业的要求,并且要在获取大区域图像的过程中可以做到尽量少的飞行的次数 ...

  3. rockycapture_RockyCapture航线规划软件介绍文档

    马上注册,享用更多功能,让我们一起,飞遍世界! 您需要 登录 才可以下载或查看,没有帐号?抢先注册 x RockyCapture 航线规划 RockyCapture 航线设计规划是基于大疆无人机,由珞 ...

  4. 【干货】无人机如何进行倾斜摄影的航线规划

    掌握天气情况 无人机航测作业前,要掌握当前天气状况,并观察云层厚度.光照强度和空气能见度. 正中午地面阴影最小,在日出到上午9点左右,下午3点左右到日落的两个时间段中,光照强度较弱且太阳高度角偏大,部 ...

  5. Ardupilot 航线规划代码学习

    目录 文章目录 目录 摘要 1.接收外部mavlink数据 1.写任务列表 2.发送任务项目的航点数量 3.发送任务项目存储到EEPROM中 4.从EEPROM中读取航点信息 2.Missionpla ...

  6. 无人机航测流程详解:航线规划、像控点布设、CC刺点建模及CASS成图

    无人机航测是传统航空摄影测量手段的有力补充,具有机动灵活.高效快速.精细准确.作业成本低.适用范围广.生产周期短等特点,在小区域和飞行困难地区高分辨率影像快速获取方面具有明显优势,随着无人机与数码相机 ...

  7. 摄影测量——无人机航线规划软件易飞(附易飞软件下载)

    文章目录 1. 软件操作流程 2. 注意事项 3. 易飞软件下载地址 无人机航线规划软件 1. 软件操作流程 1.将平板与无人机遥控器相连,选择"DJI GO 4"软件,点击[仅此 ...

  8. 大疆无人机航测实测教程:航线规划、像控点布设、刺点、成图(附航测练习数据下载)

    本篇的主要目的是为了帮助初学者,简单易懂的学习大疆无人机航测的具体流程和操作方法.将真实案例,实测数据提供给大家用来研究. 无人机航测具有机动灵活.高效快速.作业成本低.适用范围广.生产周期短等特点. ...

  9. 无人机航线规划软件[航线通]

    无人机航线规划软件-航线通(RoutePlan)是数据禾(databox.store)研发的具有自主知识产权的无人机航线规划及飞行的移动端控制软件,主要适用于大疆无人机,包括精灵系列.御系列.悟系列及 ...

  10. 大疆精灵4RTK自定义三维航线规划(开源)

    大疆精灵4rtk是无人机摄影测量行业的一款里程碑式的产品,极大地拓展了无人机摄影测量的应用领域.然而,大疆官方只提供了有限的航线规划功能,如带状航线.井字航线,5向飞行,仿地飞行等等.然而,在很多场合 ...

最新文章

  1. 顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)
  2. GM6 1.38.1 start up debug - share memory
  3. 开源自然语言处理工具包hanlp中CRF分词实现详解
  4. C# FileSystemWatcher文件监控实例
  5. 挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel
  6. 某储云商城系统源码V1.782 绿色版
  7. 【百度地图API】情人节求爱大作战——添加标注功能
  8. oracle 函數索引(1)
  9. 动态的顺序表(C语言实现)
  10. SVN update: 'skipped' message
  11. Qt开发 之 Windows资源管理器模仿 并 小超越
  12. linux屏保程序,桌面技巧小贴士 Linux下制作屏保程序
  13. ISO国家和地区代码
  14. 适用于Android的最佳笔记应用程序以及如何制作自己的应用程序
  15. sha256加密_字符串-sha256加密
  16. Red Hat Linux 9.0 网络服务入门
  17. ttys和tty_Linux中tty、pty、/dev/ttySn等概念讲解
  18. K-means(K均值)
  19. 禁止非法root的设备OTA升级
  20. spark企业级电商分析平台项目实践(一)项目介绍和需求分析

热门文章

  1. lightgbm algorithm case of kaggle(上)
  2. CentOS 7 下安装.NET Core SDK 2.1
  3. English vocabulary-1
  4. MongoDB驱动程序快速入门
  5. JavaScript Object 及相关操作
  6. d3_3 ATM模拟系统
  7. python 连接 mysql
  8. vue、react隐式实例化
  9. 循环移动(cyclic)
  10. 2017-07-12 周三 今日总结